knitr/0000755000175100001440000000000013142760271011422 5ustar hornikusersknitr/inst/0000755000175100001440000000000013142526154012377 5ustar hornikusersknitr/inst/examples/0000755000175100001440000000000013142526155014216 5ustar hornikusersknitr/inst/examples/knitr-subfloats.Rnw0000644000175100001440000000423113142522202020022 0ustar hornikusers%% LyX 2.2.1 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass{article} \usepackage[T1]{fontenc} \usepackage[latin9]{inputenc} \usepackage{url} \makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands. \providecommand{\LyX}{L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX\@} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \@ifundefined{showcaptionsetup}{}{% \PassOptionsToPackage{caption=false}{subfig}} \usepackage{subfig} \makeatother \begin{document} <>= library(knitr) opts_chunk$set(fig.path='figure/subfloats-') @ \title{Using subfloats in \LyX{} with knitr} \author{Yihui Xie} \maketitle If you insert a float figure inside a float figure in \LyX{}, you will get subfloats. To make sure the two subfloats can stand side by side, you have to: \begin{enumerate} \item remove new lines between the two subfloat environments in \LyX{} (if you are not sure if there are blank lines between them, check the \LaTeX{} source); \item use the chunk option \texttt{echo=FALSE} to hide the R source code in the output; \item set \texttt{out.width} to be less than half of the linewidth if you do not want the sub figures to exceed the page margin; \item most importantly, leave a blank line in the beginning of the subfloat environment, so that \texttt{<\textcompwordmark{}<>\textcompwordmark{}>=} starts in a new line and \textbf{knitr} can recognize it; \end{enumerate} Figure \ref{fig:knitr-subfloat} is an example. This document was compiled with \textbf{knitr} \Sexpr{packageVersion('knitr')}. Rnw source at \url{https://github.com/yihui/knitr/blob/master/inst/examples/knitr-subfloats.Rnw}. \begin{figure} \subfloat[this is a subfloat]{ <>= plot(1) @ }\subfloat[another float]{ <>= plot(rnorm(100)) @ } \caption{one figure with 2 sub figures\label{fig:knitr-subfloat}} \end{figure} \end{document} knitr/inst/examples/download_count.csv0000644000175100001440000000037412753164547017770 0ustar hornikusers"file","count" "DDR-Yihui-Xie-Chap1-3.pdf",14977 "knitr-beamer.pdf",4343 "knitr-graphics.pdf",21614 "knitr-listings.pdf",906 "knitr-manual.pdf",39178 "knitr-minimal.pdf",12695 "knitr-subfloats.pdf",218 "knitr-themes.pdf",2883 "knitr-twocolumn.pdf",533 knitr/inst/examples/knitr-manual.lyx0000644000175100001440000015253613142522202017357 0ustar hornikusers#LyX 2.1 created this file. For more info see http://www.lyx.org/ \lyxformat 474 \begin_document \begin_header \textclass article \begin_preamble \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \usepackage[buttonsize=1em]{animate} \end_preamble \use_default_options true \begin_modules knitr \end_modules \maintain_unincluded_children false \language english \language_package none \inputencoding default \fontencoding global \font_roman palatino \font_sans lmss \font_typewriter lmtt \font_math auto \font_default_family default \use_non_tex_fonts false \font_sc true \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref true \pdf_bookmarks true \pdf_bookmarksnumbered true \pdf_bookmarksopen true \pdf_bookmarksopenlevel 2 \pdf_breaklinks false \pdf_pdfborder false \pdf_colorlinks false \pdf_backref false \pdf_pdfusetitle true \pdf_quoted_options "pdfstartview={XYZ null null 1}" \papersize default \use_geometry true \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 1 \use_package mathtools 1 \use_package mhchem 1 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine natbib \cite_engine_type authoryear \biblio_style plainnat \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 1 \index Index \shortcut idx \color #008000 \end_index \leftmargin 2.5cm \topmargin 2.5cm \rightmargin 2.5cm \bottommargin 2.5cm \secnumdepth 2 \tocdepth 2 \paragraph_separation indent \paragraph_indentation default \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(knitr) \end_layout \begin_layout Plain Layout ## set global chunk options \end_layout \begin_layout Plain Layout opts_chunk$set(fig.path='figure/manual-', cache.path='cache/manual-', fig.align='ce nter', fig.show='hold', par=TRUE) \end_layout \begin_layout Plain Layout ## I use = but I can replace it with <-; set code/output width to be 68 \end_layout \begin_layout Plain Layout options(formatR.arrow=TRUE, width=68, digits=4) \end_layout \begin_layout Plain Layout ## tune details of base graphics (https://yihui.name/knitr/hooks) \end_layout \begin_layout Plain Layout knit_hooks$set(par=function(before, options, envir){ \end_layout \begin_layout Plain Layout if (before && options$fig.show!='none') par(mar=c(4,4,.1,.1),cex.lab=.95,cex.axis=.9,mg p=c(2,.7,0),tcl=-.3) \end_layout \begin_layout Plain Layout }) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Title knitr: A General-Purpose Tool for Dynamic Report Generation in R \end_layout \begin_layout Author Yihui Xie \end_layout \begin_layout Standard The original paradigm of literate programming was brought forward mainly for software development, or specifically, to mix source code (for computer) and documentation (for human) together. Early systems include \begin_inset CommandInset href LatexCommand href name "WEB" target "http://www.literateprogramming.com/web.pdf" \end_inset and \begin_inset CommandInset href LatexCommand href name "Noweb" target "http://www.cs.tufts.edu/~nr/noweb/" \end_inset ; Sweave \begin_inset CommandInset citation LatexCommand citep key "leisch2002" \end_inset was derived from the latter, but it is less focused on documenting software, instead it is mainly used for reproducible data analysis and generating statistical reports. The \series bold knitr \series default package \begin_inset CommandInset citation LatexCommand citep key "R-knitr" \end_inset is following the steps of Sweave. For this manual, I assume readers have some background knowledge of Sweave to understand the technical details; for a reference of available options, hooks and demos, see the package homepage \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://yihui.name/knitr/ \end_layout \end_inset . \end_layout \begin_layout Section Hello World \end_layout \begin_layout Standard A natural question is why to reinvent the wheel. The short answer is that extending Sweave by hacking \family sans SweaveDrivers.R \family default in the \series bold utils \series default package is a difficult job to me. Many features in \series bold knitr \series default come naturally as users would have expected. Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:cars-demo" \end_inset is a simple demo of some features of \series bold knitr \series default . \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout fit=lm(dist~speed,data=cars) # linear regression \end_layout \begin_layout Plain Layout par(mar=c(4, 4, 1, .1), mgp=c(2,1,0)) \end_layout \begin_layout Plain Layout with(cars,plot(speed,dist,panel.last=abline(fit))) \end_layout \begin_layout Plain Layout text(10,100,'$Y = \backslash \backslash beta_0 + \backslash \backslash beta_1x + \backslash \backslash epsilon$') \end_layout \begin_layout Plain Layout library(ggplot2) \end_layout \begin_layout Plain Layout qplot(speed, dist, data=cars)+geom_smooth() \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "fig:cars-demo" \end_inset A simple demo of possible output in \series bold knitr \series default : (1) multiple plots per chunk; (2) no need to \emph on print() \emph default objects in \series bold ggplot2 \series default ; (3) device size is \begin_inset Formula $4\times2.8$ \end_inset (inches) but output size is adjusted to \family typewriter .45 \backslash textwidth \family default in chunk options; (4) base graphics and \series bold ggplot2 \series default can sit side by side; (5) use the \emph on tikz() \emph default device in \series bold tikzDevice \series default by setting chunk option \family typewriter dev='tikz' \family default (hence can write native LaTeX expressions in R plots); (6) code highlighting. \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard I would have chosen to hide the R code if this were a real report, but here I show the code just for the sake of demonstration. If we type \emph on qplot() \emph default in R, we get a plot, and the same thing happens in \series bold knitr \series default . If we draw two plots in the code, \series bold knitr \series default will show two plots and we do not need to tell it how many plots are there in the code in advance. If we set \family typewriter out.width='.49 \backslash \backslash textwidth' \family default in chunk options, we get it in the final output document. If we say \family typewriter fig.align='center' \family default , the plots are centered. That's it. Many enhancements and new features will be introduced later. If you come from the Sweave land, you can take a look at the page of transition first: \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://yihui.name/knitr/demo/sweave/ \end_layout \end_inset . \end_layout \begin_layout Section Design \end_layout \begin_layout Standard The flow of processing an input file is similar to Sweave, and two major differences are that \series bold knitr \series default provides more flexibility to the users to customize the processing, and has many built-in options such as the support to a wide range of graphics devices and cache. Below is a brief description of the process: \end_layout \begin_layout Enumerate \series bold knitr \series default takes an input file and automatically determines an appropriate set of \begin_inset CommandInset href LatexCommand href name "patterns" target "https://yihui.name/knitr/patterns" \end_inset to use if they are not provided in advance (e.g. \family sans file.Rnw \family default will use \family typewriter knit_patterns$get('rnw') \family default ); \end_layout \begin_layout Enumerate a set of output \begin_inset CommandInset href LatexCommand href name "hooks" target "https://yihui.name/knitr/hooks" \end_inset will also be set up automatically according to the filename extension (e.g. use LaTeX environments or HTML elements to wrap up R results); \end_layout \begin_layout Enumerate the input file is read in and split into pieces consisting of R code chunks and normal texts; the former will be executed one after the other, and the latter may contain global chunk options or inline R code; \end_layout \begin_layout Enumerate for each chunk, the code is evaluated using the \series bold evaluate \series default package \begin_inset CommandInset citation LatexCommand citep key "R-evaluate" \end_inset , and the results may be filtered according to chunk options (e.g. \family typewriter echo=FALSE \family default will remove the R source code) \end_layout \begin_deeper \begin_layout Enumerate if \family typewriter cache=TRUE \family default for this chunk, \series bold knitr \series default will first check if there are previously cached results under the cache directory before really evaluating the chunk; if cached results exist and this code chunk has not been changed since last run (use MD5 sum to verify), the cached results will be (lazy-) loaded, otherwise new cache will be built; if a cached chunk depends on other chunks (see the \family typewriter dependson \family default \begin_inset CommandInset href LatexCommand href name "option" target "https://yihui.name/knitr/options" \end_inset ) and any one of these chunks has changed, this chunk must be forcibly updated (old cache will be purged) \end_layout \begin_layout Enumerate there are six types of possible output from \series bold evaluate \series default , and their classes are \family typewriter character \family default (normal text output), \family typewriter source \family default (source code), \family typewriter warning \family default , \family typewriter message \family default , \family typewriter error \family default and \family typewriter recordedplot \family default ; an internal S3 generic function \emph on wrap() \emph default is used to deal with different types of output, using output hooks defined in the object \family typewriter knit_hooks \end_layout \begin_layout Enumerate note plots are recorded as R objects before they are really saved to files, so graphics devices will not be opened unless plots have really been produced in a chunk \end_layout \begin_layout Enumerate a code chunk is evaluated in a separate empty environment with the global environment as its parent, and all the objects in this environment after the evaluation will be saved if \family typewriter cache=TRUE \end_layout \begin_layout Enumerate chunk hooks can be run before and/or after a chunk \end_layout \end_deeper \begin_layout Enumerate for normal texts, \series bold knitr \series default will find inline R code (e.g. in \family typewriter \backslash Sexpr{} \family default ) and evaluate it; the output is wrapped by the \family typewriter inline \family default hook; \end_layout \begin_layout Standard The hooks play important roles in \series bold knitr \series default : this package makes almost everything accessible to the users. Consider the following extremely simple example which may demonstrate this freedom: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout 1+1 \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard There are two parts in the final output: the source code \family typewriter 1 + 1 \family default and the output \family typewriter [1] 2 \family default ; the comment characters \family typewriter ## \family default are from the default chunk option \family typewriter comment \family default . Users may define a hook function for the source code like this to use the \family typewriter lstlisting \family default environment: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout knit_hooks$set(source = function(x, options) { \end_layout \begin_layout Plain Layout paste(' \backslash \backslash begin{lstlisting} \backslash n', x, ' \backslash \backslash end{lstlisting} \backslash n', sep = '') \end_layout \begin_layout Plain Layout }) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Similarly we can put other types of output into other environments. There is no need to hack at \family sans Sweave.sty \family default for \series bold knitr \series default and you can put the output in any environments. What is more, the output hooks make \series bold knitr \series default ready for other types of output, and a typical one is HTML (there are built-in hooks). The website has provided many examples demonstrating the flexibility of the output. \end_layout \begin_layout Section Features \end_layout \begin_layout Standard The \series bold knitr \series default package borrowed features such as tikz graphics and cache from \series bold pgfSweave \series default and \series bold cacheSweave \series default respectively, but the implementations are different. New features like code reference from an external R script as well as output customization are also introduced. The feature of hook functions in Sweave is re-implemented and hooks have new usage now. There are several other small features which are motivated from my everyday use of Sweave. For example, a progress bar is provided when knitting a file so we roughly know how long we still need to wait; output from inline R code (e.g. \family typewriter \backslash Sexpr{x[1]} \family default ) is automatically formatted in TeX math notation (like \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash Sexpr{123456789} \end_layout \end_inset ) if the result is numeric. You may check out a number of specific manuals dedicated to specific features such as graphics in the website: \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://yihui.name/knitr/demos \end_layout \end_inset . \end_layout \begin_layout Subsection Code Decoration \end_layout \begin_layout Standard The \series bold highr \series default package \begin_inset CommandInset citation LatexCommand citep key "R-highr" \end_inset is used to highlight R code, and the \series bold formatR \series default package \begin_inset CommandInset citation LatexCommand citep key "R-formatR" \end_inset is used to reformat R code (like \family typewriter keep.source=FALSE \family default in Sweave but will also try to retain comments). For LaTeX output, the \series bold framed \series default package is used to decorate code chunks with a light gray background. If this LaTeX package is not found in the system, a version will be copied directly from \series bold knitr \series default . The prompt characters are removed by default because they mangle the R source code in the output and make it difficult to copy R code. The R output is masked in comments by default based on the same rationale. It is easy to revert to the output with prompts (set option \family typewriter prompt=TRUE \family default ), and you will quickly realize the inconvenience to the readers if they want to copy and run the code in the output document: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout x=rnorm(5) \end_layout \begin_layout Plain Layout x \end_layout \begin_layout Plain Layout var(x) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard The example below shows the effect of \family typewriter tidy=TRUE/FALSE \family default : \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout ## option tidy=FALSE \end_layout \begin_layout Plain Layout for(k in 1:10){j=cos(sin(k)*k^2)+3;print(j-5)} \end_layout \begin_layout Plain Layout @ \end_layout \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout ## option tidy=TRUE \end_layout \begin_layout Plain Layout for(k in 1:10){j=cos(sin(k)*k^2)+3;print(j-5)} \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Note \family typewriter = \family default is replaced by \family typewriter <- \family default because \family typewriter options('formatR.arrow') \family default was set to be \family typewriter TRUE \family default in this document; see the documentation of \emph on tidy.source() \emph default in \series bold formatR \series default for details. \end_layout \begin_layout Standard Many highlighting themes can be used in \series bold knitr \series default , which are borrowed from the \series bold highlight \series default package by \begin_inset CommandInset href LatexCommand href name "Andre Simon" target "http://www.andre-simon.de/" \end_inset \begin_inset Foot status open \begin_layout Plain Layout not the R package mentioned before; for a preview of these themes, see \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://www.andre-simon.de/dokuwiki/doku.php?id=theme_examples \end_layout \end_inset \end_layout \end_inset ; it is also possible to use themes from \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://www.eclipsecolorthemes.org/ \end_layout \end_inset by providing a theme id to \series bold knitr \series default \begin_inset Foot status open \begin_layout Plain Layout many thanks to \begin_inset CommandInset href LatexCommand href name "Ramnath Vaidyanathan" target "https://github.com/ramnathv" \end_inset for the work on themes \end_layout \end_inset . See \family typewriter ?knit_theme \family default for details. \end_layout \begin_layout Subsection Graphics \end_layout \begin_layout Standard Graphics is an important part of reports, and several enhancements have been made in \series bold knitr \series default . For example, grid graphics may not need to be explicitly printed as long as the same code can produce plots in R (in some cases, however, they have to be printed, e.g. in a loop, because you have to do so in an R terminal). \end_layout \begin_layout Subsubsection Graphical Devices \end_layout \begin_layout Standard Over a long time, a frequently requested feature for Sweave was the support for other graphics devices, which has been implemented since R 2.13.0. Instead of using logical options like \family typewriter png \family default or \family typewriter jpeg \family default (this list can go on and on), \series bold knitr \series default uses a single option \family typewriter dev \family default (like \family typewriter grdevice \family default in Sweave) which has support for more than 20 devices. For instance, \family typewriter dev='png' \family default will use the \emph on png() \emph default device, and \family typewriter dev='CairoJPEG' \family default uses the \emph on CairoJPEG() \emph default device in the \series bold Cairo \series default package (it has to be installed first, of course). If none of these devices is satisfactory, you can provide the name of a customized device function, which must have been defined before it is called. \end_layout \begin_layout Subsubsection Plot Recording \end_layout \begin_layout Standard As mentioned before, all the plots in a code chunk are first recorded as R objects and then \begin_inset Quotes eld \end_inset replayed \begin_inset Quotes erd \end_inset inside a graphical device to generate plot files. The \series bold evaluate \series default package will record plots per \emph on expression \emph default basis, in other words, the source code is split into individual complete expressions and \series bold evaluate \series default will examine possible plot changes in snapshots after each single expression has been evaluated. For example, the code below consists of three expressions, out of which two are related to drawing plots, therefore \series bold evaluate \series default will produce two plots by default: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout par(mar=c(3,3,.1,.1)) \end_layout \begin_layout Plain Layout plot(1:10, ann=FALSE,las=1) \end_layout \begin_layout Plain Layout text(5,9,'mass $ \backslash \backslash rightarrow$ energy \backslash n$E=mc^2$') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard This brings a significant difference with traditional tools in R for dynamic report generation, since low-level plotting changes can also be recorded. The option \family typewriter fig.keep \family default controls which plots to keep in the output; \family typewriter fig.keep='all' \family default will keep low-level changes as separate plots; by default ( \family typewriter fig.keep='high' \family default ), \series bold knitr \series default will merge low-level plot changes into the previous high-level plot, like most graphics devices do. This feature may be useful for teaching R graphics step by step. Note, however, low-level plotting commands in a single expression (a typical case is a loop) will not be recorded accumulatively, but high-level plotting commands, regardless of where they are, will always be recorded. For example, this chunk will only produce 2 plots instead of 21 plots because there are 2 complete expressions: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout plot(0,0,type='n',ann=FALSE) \end_layout \begin_layout Plain Layout for(i in seq(0, 2*pi,length=20)) points(cos(i),sin(i)) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard But this will produce 20 plots as expected: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout for(i in seq(0, 2*pi,length=20)) {plot(cos(i),sin(i),xlim=c(-1,1),ylim=c(-1,1))} \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard As I showed in the beginning of this manual, it is straightforward to let \series bold knitr \series default keep all the plots in a chunk and insert them into the output document, so we no longer need the \family typewriter cat(' \backslash \backslash includegraphics{}') \family default trick. \end_layout \begin_layout Standard We can discard all previous plots and keep the last one only by \family typewriter fig.keep='last' \family default , or keep only the first plot by \family typewriter fig.keep='first' \family default , or discard all plots by \family typewriter fig.keep='none' \family default . \end_layout \begin_layout Subsubsection Plot Rearrangement \end_layout \begin_layout Standard The option \family typewriter fig.show \family default can decide whether to hold all plots while evaluating the code and \begin_inset Quotes eld \end_inset flush \begin_inset Quotes erd \end_inset all of them to the end of a chunk ( \family typewriter fig.show='hold' \family default ), or just insert them to the place where they were created (by default \family typewriter fig.show='asis' \family default ). Here is an example of \family typewriter fig.show='asis' \family default : \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout contour(volcano) # contour lines \end_layout \begin_layout Plain Layout filled.contour(volcano) # fill contour plot with colors \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Beside \family typewriter hold \family default and \family typewriter asis \family default , the option \family typewriter fig.show \family default can take a third value: \family typewriter animate \family default , which makes it possible to insert animations into the output document. In LaTeX, the package \series bold animate \series default is used to put together image frames as an animation. For animations to work, there must be more than one plot produced in a chunk. The option \family typewriter interval \family default controls the time interval between animation frames; by default it is 1 second. Note you have to add \family typewriter \backslash usepackage{animate} \family default in the LaTeX preamble, because \series bold knitr \series default will not add it automatically. Animations in the PDF output can only be viewed in Adobe Reader. \end_layout \begin_layout Standard As a simple demonstration, here is a \begin_inset CommandInset href LatexCommand href name "Mandelbrot animation" target "http://en.wikipedia.org/wiki/Mandelbrot_set" \end_inset taken from the \series bold animation \series default package \begin_inset CommandInset citation LatexCommand citep key "R-animation" \end_inset ; note the PNG device is used because PDF files are too large. You should be able to see the animation immediately with Acrobat Reader since it was set to play automatically: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(animation) \end_layout \begin_layout Plain Layout demo('Mandelbrot', echo = FALSE, package = 'animation') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Subsubsection Plot Size \end_layout \begin_layout Standard The \family typewriter fig.width \family default and \family typewriter fig.height \family default options specify the size of plots in the graphics device, and the real size in the output document can be different (see \family typewriter out.width \family default and \family typewriter out.height \family default ). When there are multiple plots per chunk, it is possible to arrange more than one plot per line in LaTeX -- just specify \family typewriter out.width \family default to be less than half of the current line width, e.g. \family typewriter out.width='.49 \backslash \backslash linewidth' \family default . \end_layout \begin_layout Subsubsection The tikz Device \end_layout \begin_layout Standard Beside PDF, PNG and other traditional R graphical devices, \series bold knitr \series default has special support to tikz graphics via the \series bold tikzDevice \series default package \begin_inset CommandInset citation LatexCommand citep key "R-tikzDevice" \end_inset , which is similar to \series bold pgfSweave \series default . If we set the chunk option \family typewriter dev='tikz' \family default , the \emph on tikz() \emph default device in \series bold tikzDevice \series default will be used to save plots. Options \family typewriter sanitize \family default and \family typewriter external \family default are related to the tikz device: see the documentation of \emph on tikz() \emph default for details. Note \family typewriter external=TRUE \family default in \series bold knitr \series default has a different meaning with \series bold pgfSweave \series default -- it means \family typewriter standAlone=TRUE \family default in \emph on tikz() \emph default , and the tikz graphics output will be compiled to PDF \emph on immediately \emph default after it is created, so the \begin_inset Quotes eld \end_inset externalization \begin_inset Quotes erd \end_inset does not depend on the \series bold tikz \series default package; to maintain consistency in (font) styles, \series bold knitr \series default will read the preamble of the input document and use it in the tikz device. At the moment, I'm not sure if this is a faithful way to externalize tikz graphics, but I have not seen any problems so far. The assumption to make, however, is that you declare all the styles in the preamble; \series bold knitr \series default is agnostic of \emph on local \emph default style changes in the body of the document. \end_layout \begin_layout Standard Below is an example taken from StackOverflow \begin_inset Foot status open \begin_layout Plain Layout \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://stackoverflow.com/q/8190087/559676 \end_layout \end_inset \end_layout \end_inset ; we usually have to write R code like this to obtain a math expression \begin_inset Formula $\mathrm{d}\mathbf{x}_{t}=\alpha[(\theta-\mathbf{x}_{t})\mathrm{d}t+4]\mathrm{d}B_{t}$ \end_inset in R graphics: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout qplot(1:10, 1:10) + opts(title = substitute(paste(d * \end_layout \begin_layout Plain Layout bolditalic(x)[italic(t)] == alpha * (theta - bolditalic(x)[italic(t)]) * \end_layout \begin_layout Plain Layout d * italic(t) + lambda * d * italic(B)[italic(t)]), list(lambda = 4))) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard With the tikz device, it is both straightforward and more beautiful: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(ggplot2) \end_layout \begin_layout Plain Layout qplot(1:10, 1:10) + \end_layout \begin_layout Plain Layout labs(title = sprintf('$ \backslash \backslash mathrm{d} \backslash \backslash mathbf{x}_{t} = \backslash \backslash alpha[( \backslash \backslash theta - \backslash \backslash mathbf{x}_{t}) \backslash \backslash mathrm{d}t + %d] \backslash \backslash mathrm{d}B_{t}$', 4)) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard The advantage of tikz graphics is the consistency of styles \begin_inset Foot status collapsed \begin_layout Plain Layout Users are encouraged to read the vignette of \series bold tikzDevice \series default , which is the most beautiful vignette I have ever seen in R packages: \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://cran.r-project.org/web/packages/tikzDevice/vignettes/tikzDevice.pdf \end_layout \end_inset \end_layout \end_inset , and one disadvantage is that LaTeX may not be able to handle too large tikz files (it can run out of memory). For example, an R plot with tens of thousands of graphical elements may fail to compile in LaTeX if we use the tikz device. In such cases, we can switch to the PDF or PNG device, or reconsider our decision on the type of plots, e.g., a scatter plot with millions of points is usually difficult to read, and a contour plot or a hexagon plot showing the 2D density can be a better alternative (they are smaller in size). \end_layout \begin_layout Standard The graphics manual contains more detailed information and you can check it out in the \begin_inset CommandInset href LatexCommand href name "website" target "https://yihui.name/knitr/demo/graphics/" \end_inset . \end_layout \begin_layout Subsection Cache \end_layout \begin_layout Standard The feature of cache is not a new idea -- both \series bold cacheSweave \series default and \series bold weaver \series default have implemented it based on Sweave, with the former using \series bold filehash \series default and the latter using \family sans .RData \family default images; \series bold cacheSweave \series default also supports lazy-loading of objects based on \series bold filehash \series default . The \series bold knitr \series default package directly uses internal base R functions to save ( \emph on tools:::makeLazyLoadDB() \emph default ) and lazy-load objects ( \emph on lazyLoad() \emph default ). These functions are either undocumented or marked as internal, but as far as I understand, they are the tools to implement lazy-loading for packages. The \series bold cacheSweave \series default vignette has clearly explained lazy-loading, and roughly speaking, lazy-loading means an object will not be really loaded into memory unless it is really used somewhere. This is very useful for cache; sometimes we read a large object and cache it, then take a subset for analysis and this subset is also cached; in the future, the initial large object will not be loaded into R if our computati on is only based on the object of its subset. \end_layout \begin_layout Standard The paths of cache files are determined by the chunk option \family typewriter cache.path \family default ; by default all cache files are created under a directory \family sans cache \family default relative to the current working directory, and if the option value contains a directory (e.g. \family typewriter cache.path='cache/abc-' \family default ), cache files will be stored under that directory (automatically created if it does not exist). The cache is invalidated and purged on any changes to the code chunk, including both the R code and chunk options \begin_inset Foot status open \begin_layout Plain Layout One exception is the \family typewriter include \family default option, which is not cached because \family typewriter include=TRUE/FALSE \family default does not affect code evaluation; meanwhile, the value \family typewriter getOption('width') \family default is also cached, so if you change this option, the cache will also be invalidate d (this option affects the width of text output) \end_layout \end_inset ; this means previous cache files of this chunk are removed (filenames are identified by the chunk label). Unlike \series bold pgfSweave \series default , cache files will never accumulate since old cache files will always be removed in \series bold knitr \series default . Unlike \series bold weaver \series default or \series bold cacheSweave \series default , \series bold knitr \series default will try to preserve these side-effects: \end_layout \begin_layout Enumerate printed results: meaning that any output of a code chunk will be loaded into the output document for a cached chunk, although it is not really evaluated. The reason is \series bold knitr \series default also cache the output of a chunk as a character string. Note this means graphics output is also cached since it is part of the output. It has been a pain for me for a long time to have to lose output to gain cache; \end_layout \begin_layout Enumerate loaded packages: after the evaluation of each cached chunk, the list of packages used in the current R session is written to a file under the cache path named \family sans __packages \family default ; next time if a cached chunk needs to be rebuilt, these packages will be loaded first. The reasons for caching package names are, it can be slow to load some packages, and a package might be loaded in a previous cached chunk which is not available to the next cached chunk when only the latter needs to be rebuilt. Note this only applies to cached chunks, and for uncached chunks, you must always use \emph on library() \emph default to load packages explicitly; \end_layout \begin_layout Standard Although \series bold knitr \series default tries to keep some side-effects, there are still other types of side-effects like setting \emph on par() \emph default or \emph on options() \emph default which are not cached. Users should be aware of these special cases, and make sure to clearly separate the code which is not meant to be cached to other chunks which are not cached, e.g., set all global options in the first chunk of a document and do not cache that chunk. \end_layout \begin_layout Standard Sometimes a cached chunk may need to use objects from other cached chunks, which can bring a serious problem -- if objects in previous chunks have changed, this chunk will not be aware of the changes and will still use old cached results, unless there is a way to detect such changes from other chunks. There is an option called \family typewriter dependson \family default in \series bold cacheSweave \series default which does this job. We can explicitly specify which other chunks this chunk depends on by setting an option like \family typewriter dependson='chunkA;chunkB' \family default or equivalently \family typewriter dependson=c('chunkA', 'chunkB') \family default . Each time the cache of a chunk is rebuilt, all other chunks which depend on this chunk will lose cache, hence their cache will be rebuilt as well. \end_layout \begin_layout Standard Another way to specify the dependencies among chunks is to use the chunk option \family typewriter autodep \family default and the function \emph on dep_auto() \emph default . This is an experimental feature borrowed from \series bold weaver \series default which frees us from setting chunk dependencies manually. The basic idea is, if a latter chunk uses any objects created from a previous chunk, the latter chunk is said to depend on the previous one. The function \emph on findGlobals() \emph default in the \series bold codetools \series default package is used to find out all global objects in a chunk, and according to its documentation, the result is an approximation. Global objects roughly mean the ones which are not created locally, e.g. in the expression \family typewriter function() {y <- x} \family default , \family typewriter x \family default should be a global object, whereas \family typewriter y \family default is local. Meanwhile, we also need to save the list of objects created in each cached chunk, so that we can compare them to the global objects in latter chunks. For example, if chunk A created an object \family typewriter x \family default and chunk B uses this object, chunk B must depend on A, i.e. whenever A changes, B must also be updated. When \family typewriter autodep=TRUE \family default , \series bold knitr \series default will write out the names of objects created in a cached chunk as well as those global objects in two files named \family sans __objects \family default and \family sans __globals \family default respectively; later we can use the function \emph on dep_auto() \emph default to analyze the object names to figure out the dependencies automatically. See \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://yihui.name/knitr/demo/cache/ \end_layout \end_inset for examples. \end_layout \begin_layout Standard Yet another way to specify dependencies is \emph on dep_prev() \emph default : this is a conservative approach which sets the dependencies so that a cached chunk will depend on all its previous chunks, i.e. whenever a previous chunk is updated, all later chunks will be updated accordingly. \end_layout \begin_layout Subsection Code Externalization \end_layout \begin_layout Standard It can be more convenient to write R code in a separate file, rather than mixing it into a LaTeX document; for example, we can run R code successively in a pure R script from one chunk to the other without jumping through other texts. Since I prefer using LyX to write reports, Sweave is even more inconvenient because I have to recompile the whole document each time, even if I only want to know the results of a single chunk. Therefore \series bold knitr \series default introduced the feature of code externalization to a separate R script. Currently the setting is like this: the R script also uses chunk labels (marked in the form \family typewriter ## ---- chunk-label \family default by default); if the code chunk in the input document is empty, \series bold knitr \series default will match its label with the label in the R script to input external R code. For example, suppose this is a code chunk labelled as \family typewriter Q1 \family default in an R script named \family sans homework1-xie.R \family default which is under the same directory as the Rnw document: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout ## ---- Q1 --------------------- \end_layout \begin_layout Plain Layout gcd = function(m, n) { \end_layout \begin_layout Plain Layout while ((r <- m %% n) != 0) { \end_layout \begin_layout Plain Layout m = n; n = r \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout n \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard In the Rnw document, we can first read the script using the function \emph on read_chunk() \emph default : \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout read_chunk('homework1-xie.R') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard This is usually done in an early chunk, and we can use the chunk \family typewriter Q1 \family default later in the Rnw document: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout cat('<>=','@',sep=' \backslash n') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Different documents can read the same R script, so the R code can be reusable across different input documents. \end_layout \begin_layout Subsection Evaluation of Chunk Options \begin_inset CommandInset label LatexCommand label name "sub:conditional" \end_inset \end_layout \begin_layout Standard By default \series bold knitr \series default uses a new syntax to parse chunk options: it treats them as function arguments instead of a text string to be split to obtain option values. This gives the user much more power than the old syntax; we can pass arbitrary R objects to chunk options besides simple ones like \family typewriter TRUE \family default / \family typewriter FALSE \family default , numbers and character strings. The page \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://yihui.name/knitr/demo/sweave/ \end_layout \end_inset has given two examples to show the advantages of the new syntax. Here we show yet another useful application. \end_layout \begin_layout Standard Before \series bold knitr \series default 0.3, there was a feature named \begin_inset Quotes eld \end_inset conditional evaluation \begin_inset Quotes erd \end_inset \begin_inset Foot status open \begin_layout Plain Layout request from \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://plus.google.com/u/0/116405544829727492615/posts/43WrRUffjzK \end_layout \end_inset \end_layout \end_inset . The idea is, instead of setting chunk options \family typewriter eval \family default and \family typewriter echo \family default to be \family typewriter TRUE \family default or \family typewriter FALSE \family default (constants), their values can be controlled by global variables in the current R session. This enables \series bold knitr \series default to conditionally evaluate code chunks according to variables. For example, here we assign \family typewriter TRUE \family default to a variable \family typewriter dothis \family default : \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout dothis=TRUE \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard In the next chunk, we set chunk options \family typewriter eval=dothis \family default and \family typewriter echo=!dothis \family default , both are valid R expressions since the variable \family typewriter dothis \family default exists. As we can see, the source code is hidden, but it was indeed evaluated: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout print('you cannot see my source because !dothis is FALSE') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Then we set \family typewriter eval=dothis \family default and \family typewriter echo=dothis \family default for another chunk: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout dothis \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard If we change the value of \family typewriter dothis \family default to \family typewriter FALSE \family default , neither of the above chunks will be evaluated any more. Therefore we can control many chunks with a single variable, and present results selectively. \end_layout \begin_layout Standard This old feature requires \series bold knitr \series default to treat \family typewriter eval \family default and \family typewriter echo \family default specially, and we can easily see that it is no longer necessary with the new syntax: \family typewriter eval=dothis \family default will tell R to find the variable \family typewriter dothis \family default automatically just like we call a function \family typewriter foobar(eval = dothis) \family default . What is more, all options will be evaluated as R expressions unless they are already constants which do not need to be evaluated, so this old feature has been generalized to all other options naturally. \end_layout \begin_layout Subsection Customization \end_layout \begin_layout Standard The \series bold knitr \series default package is ready for customization. Both the patterns and hooks can be customized; see the package website for details. Here I show an example on how to save \series bold rgl \series default plots \begin_inset CommandInset citation LatexCommand citep key "R-rgl" \end_inset using a customized hook function. First we define a hook named \family typewriter rgl \family default using the function \emph on hook_rgl() \emph default in \series bold rgl \series default : \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(rgl) \end_layout \begin_layout Plain Layout knit_hooks$set(rgl = hook_rgl) \end_layout \begin_layout Plain Layout head(hook_rgl) # the hook function is defined as this \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Then we only have to set the chunk option \family typewriter rgl=TRUE \family default : \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(rgl) \end_layout \begin_layout Plain Layout demo('bivar', package='rgl', echo=FALSE) \end_layout \begin_layout Plain Layout par3d(zoom=.7) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Due to the flexibility of output hooks, \series bold knitr \series default supports several different output formats. The implementation is fairly easy, e.g., for LaTeX we put R output in \family typewriter verbatim \family default environments, and in HTML, it is only a matter of putting output in \family typewriter div \family default layers. These are simply character string operations. Many demos in \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://yihui.name/knitr/demos \end_layout \end_inset show this idea clearly. This manual did not cover all the features of \series bold knitr \series default , and users are encouraged to thumb through the website to know more possible features. \end_layout \begin_layout Section Editors \end_layout \begin_layout Standard You can use any text editors to write the source documents, but some have built-in support for \series bold knitr \series default . Both RStudio ( \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://www.rstudio.org \end_layout \end_inset ) and LyX ( \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://www.lyx.org \end_layout \end_inset ) have full support for \series bold knitr \series default , and you can compile the document to PDF with just one click. See \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://yihui.name/knitr/demo/rstudio/ \end_layout \end_inset and \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://yihui.name/knitr/demo/lyx/ \end_layout \end_inset respectively. It is also possible to support other editors like \begin_inset CommandInset href LatexCommand href name "Eclipse" target "https://yihui.name/knitr/demo/eclipse/" \end_inset , \begin_inset CommandInset href LatexCommand href name "Texmaker and WinEdt" target "https://yihui.name/knitr/demo/editors/" \end_inset ; see the demo list in the website for configuration instructions. \end_layout \begin_layout Section* About This Document \end_layout \begin_layout Standard This manual was written in LyX and compiled with \series bold knitr \series default (version \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash Sexpr{packageVersion('knitr')} \end_layout \end_inset ). The LyX source and the Rnw document exported from LyX can be found under these directories: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout system.file('examples', 'knitr-manual.lyx', package='knitr') # lyx source \end_layout \begin_layout Plain Layout system.file('examples', 'knitr-manual.Rnw', package='knitr') # Rnw source \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard You can use the function \emph on knit() \emph default to knit the Rnw document (remember to put the two \family sans .bib \family default files under the same directory), and you need to make sure all the R packages used in this document are installed: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout install.packages(c('animation', 'rgl', 'tikzDevice', 'ggplot2')) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Feedback and comments on this manual and the package are always welcome. Bug reports and feature requests can be sent to \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://github.com/yihui/knitr/issues \end_layout \end_inset , and questions can be delivered to the \begin_inset CommandInset href LatexCommand href name "mailing list" target "knitr@googlegroups.com" type "mailto:" \end_inset \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://groups.google.com/group/knitr \end_layout \end_inset . \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout % when knitr is updated, this chunk will be updated; why? \end_layout \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout # write all packages in the current session to a bib file \end_layout \begin_layout Plain Layout write_bib(c(.packages(), 'evaluate', 'formatR', 'highr'), file = 'knitr-packages.b ib') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset CommandInset bibtex LatexCommand bibtex bibfiles "knitr-manual,knitr-packages" options "jss" \end_inset \end_layout \end_body \end_document knitr/inst/examples/knitr-spin.R0000644000175100001440000000274513142522202016434 0ustar hornikusers#' This is a special R script which can be used to generate a report. You can #' write normal text in roxygen comments. #' #' First we set up some options (you do not have to do this): #+ setup, include=FALSE library(knitr) opts_chunk$set(fig.path = 'figure/silk-') #' The report begins here. #+ test-a, cache=FALSE # boring examples as usual set.seed(123) x = rnorm(5) mean(x) #' You can use the special syntax {{code}} to embed inline expressions, e.g. {{mean(x) + 2}} #' is the mean of x plus 2. #' The code itself may contain braces, but these are not checked. Thus, #' perfectly valid (though very strange) R code such as `{{2 + 3}} - {{4 - 5}}` #' can lead to errors because `2 + 3}} - {{4 - 5` will be treated as inline code. #' #' Now we continue writing the report. We can draw plots as well. #+ test-b, fig.width=5, fig.height=5 par(mar = c(4, 4, .1, .1)); plot(x) #' Actually you do not have to write chunk options, in which case knitr will use #' default options. For example, the code below has no options attached: var(x) quantile(x) #' And you can also write two chunks successively like this: #+ test-chisq5 sum(x^2) # chi-square distribution with df 5 #+ test-chisq4 sum((x - mean(x))^2) # df is 4 now #' Done. Call spin('knitr-spin.R') to make silk from sow's ear now and knit a #' lovely purse. # /* you can write comments between /* and */ like C comments (the preceding # # is optional) Sys.sleep(60) # */ # /* there is no inline comment; you have to write block comments */ knitr/inst/examples/knitr-packages.bib0000644000175100001440000000526013010461566017600 0ustar hornikusers@Manual{R-animation, title = {animation: A Gallery of Animations in Statistics and Utilities to Create Animations}, author = {Yihui Xie}, year = {2015}, note = {R package version 2.4}, url = {https://CRAN.R-project.org/package=animation}, } @Manual{R-base, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2016}, url = {https://www.R-project.org/}, } @Manual{R-codetools, title = {codetools: Code Analysis Tools for R}, author = {Luke Tierney}, year = {2016}, note = {R package version 0.2-15}, url = {https://CRAN.R-project.org/package=codetools}, } @Manual{R-evaluate, title = {evaluate: Parsing and Evaluation Tools that Provide More Details than the Default}, author = {Hadley Wickham}, year = {2016}, note = {R package version 0.10}, url = {https://github.com/hadley/evaluate}, } @Manual{R-filehash, title = {filehash: Simple Key-Value Database}, author = {Roger D. Peng}, year = {2015}, note = {R package version 2.3}, url = {https://CRAN.R-project.org/package=filehash}, } @Manual{R-formatR, title = {formatR: Format R Code Automatically}, author = {Yihui Xie}, year = {2016}, note = {R package version 1.4}, url = {https://CRAN.R-project.org/package=formatR}, } @Manual{R-ggplot2, title = {ggplot2: An Implementation of the Grammar of Graphics}, author = {Hadley Wickham and Winston Chang}, year = {2016}, note = {R package version 2.1.0}, url = {https://CRAN.R-project.org/package=ggplot2}, } @Manual{R-highr, title = {highr: Syntax Highlighting for R Source Code}, author = {Yixuan Qiu and Yihui Xie}, year = {2016}, note = {R package version 0.6}, url = {https://CRAN.R-project.org/package=highr}, } @Manual{R-knitr, title = {knitr: A General-Purpose Package for Dynamic Report Generation in R}, author = {Yihui Xie}, year = {2016}, note = {R package version 1.15}, url = {http://yihui.name/knitr/}, } @Manual{R-MASS, title = {MASS: Support Functions and Datasets for Venables and Ripley's MASS}, author = {Brian Ripley}, year = {2016}, note = {R package version 7.3-45}, url = {https://CRAN.R-project.org/package=MASS}, } @Manual{R-rgl, title = {rgl: 3D Visualization Using OpenGL}, author = {Daniel Adler and Duncan Murdoch}, year = {2016}, note = {R package version 0.96.0}, url = {https://CRAN.R-project.org/package=rgl}, } @Manual{R-tikzDevice, title = {tikzDevice: R Graphics Output in LaTeX Format}, author = {Charlie Sharpsteen and Cameron Bracken}, year = {2016}, note = {R package version 0.10-1}, url = {https://CRAN.R-project.org/package=tikzDevice}, } knitr/inst/examples/knitr-beamer.lyx0000644000175100001440000001444313142522202017327 0ustar hornikusers#LyX 2.1 created this file. For more info see http://www.lyx.org/ \lyxformat 474 \begin_document \begin_header \textclass beamer \begin_preamble \usetheme{PaloAlto} \end_preamble \use_default_options true \begin_modules knitr \end_modules \maintain_unincluded_children false \language english \language_package none \inputencoding default \fontencoding global \font_roman default \font_sans default \font_typewriter default \font_math auto \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize 10 \spacing single \use_hyperref true \pdf_bookmarks true \pdf_bookmarksnumbered false \pdf_bookmarksopen false \pdf_bookmarksopenlevel 1 \pdf_breaklinks false \pdf_pdfborder true \pdf_colorlinks false \pdf_backref false \pdf_pdfusetitle true \papersize default \use_geometry true \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 1 \use_package mathtools 1 \use_package mhchem 1 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine basic \cite_engine_type default \biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 1 \index Index \shortcut idx \color #008000 \end_index \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(knitr) \end_layout \begin_layout Plain Layout opts_chunk$set(fig.path='figure/beamer-',fig.align='center',fig.show='hold',size='f ootnotesize') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Title \begin_inset Argument 1 status collapsed \begin_layout Plain Layout knitr, Beamer, and FragileFrame \end_layout \end_inset A Minimal Demo of knitr with Beamer and Fragile Frames \end_layout \begin_layout Author Yihui Xie \begin_inset Foot status open \begin_layout Plain Layout I thank Richard E. Goldberg for providing this demo. \end_layout \end_inset \end_layout \begin_layout Frame \begin_inset Argument 4 status open \begin_layout Plain Layout Background \end_layout \end_inset \end_layout \begin_deeper \begin_layout Itemize The \series bold knitr \emph on \series default \emph default package allows you to embed R code and figures in LaTeX documents \end_layout \begin_deeper \begin_layout Itemize It has functionality similar to Sweave but looks nicer and gives you more control \end_layout \end_deeper \begin_layout Itemize If you already have Sweave working in LyX, getting \series bold knitr \series default to work is trivial \end_layout \begin_deeper \begin_layout Enumerate Install the \series bold knitr \series default package in \emph on R \end_layout \begin_layout Enumerate Read \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://yihui.name/knitr/demo/lyx/ \end_layout \end_inset \end_layout \end_deeper \begin_layout Itemize If you use Sweave or \series bold knitr \series default with Beamer in LyX, you must use the \emph on FragileFrame \emph default environment for the frames that contain R code chunks. Let's see if \series bold knitr \series default works with Beamer in this small demo. \end_layout \end_deeper \begin_layout Section First Test \end_layout \begin_layout FragileFrame \begin_inset Argument 4 status open \begin_layout Plain Layout First Test \end_layout \end_inset \end_layout \begin_deeper \begin_layout Standard OK, let's get started with just some text: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout # some setup \end_layout \begin_layout Plain Layout options(width=60) # make the printing fit on the page \end_layout \begin_layout Plain Layout set.seed(1121) # make the results repeatable \end_layout \begin_layout Plain Layout @ \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout <<>>= \end_layout \begin_layout Plain Layout # create some random numbers \end_layout \begin_layout Plain Layout (x=rnorm(20)) \end_layout \begin_layout Plain Layout mean(x);var(x) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard BTW, the first element of \family typewriter x \family default is \begin_inset ERT status open \begin_layout Plain Layout \backslash Sexpr{x[1]} \end_layout \end_inset . (Did you notice the use of \family typewriter \backslash Sexpr{} \family default ?) \end_layout \end_deeper \begin_layout Section Second Test \end_layout \begin_layout FragileFrame \begin_inset Argument 4 status open \begin_layout Plain Layout Second Test \end_layout \end_inset \end_layout \begin_deeper \begin_layout Standard Text is nice but let's see what happens if we make a couple of plots in our chunk: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout par(las=1,mar=c(4,4,.1,.1)) # tick labels direction \end_layout \begin_layout Plain Layout boxplot(x) \end_layout \begin_layout Plain Layout hist(x,main='',col="blue",probability=TRUE) \end_layout \begin_layout Plain Layout lines(density(x),col="red") \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \end_deeper \begin_layout Section The Big Question \end_layout \begin_layout Frame \begin_inset Argument 4 status open \begin_layout Plain Layout The Big Question \end_layout \end_inset \end_layout \begin_deeper \begin_layout Standard Do the above chunks work? You should be able to compile the LyX document and get a nice-looking PDF slide presentation. If not, time to double-check everything... \end_layout \end_deeper \end_body \end_document knitr/inst/examples/knitr-input-child.Rnw0000644000175100001440000000022113142522202020233 0ustar hornikusersThis chunk below is from the child document. <>= 1+1 rnorm(5) plot(1) boxplot(1:10) str(mtcars) @ knitr/inst/examples/knitr-twocolumn.Rnw0000644000175100001440000000402013142522202020043 0ustar hornikusers%% LyX 2.2.1 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass[twocolumn]{article} \usepackage[sc]{mathpazo} \usepackage[T1]{fontenc} \usepackage{geometry} \geometry{verbose,tmargin=3cm,bmargin=3cm,lmargin=3cm,rmargin=3cm} \setcounter{secnumdepth}{2} \setcounter{tocdepth}{2} \setlength{\parskip}{\bigskipamount} \setlength{\parindent}{0pt} \usepackage{url} \usepackage[unicode=true,pdfusetitle, bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2, breaklinks=false,pdfborder={0 0 1},backref=false,colorlinks=false] {hyperref} \hypersetup{ pdfstartview={XYZ null null 1}} \usepackage{breakurl} \makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \makeatother \begin{document} <>= library(knitr) opts_chunk$set(fig.path='figure/twocolumn-', fig.align='center', fig.show='hold') render_listings() @ \title{Using knitr in A Two-column Document} \author{Yihui Xie} \maketitle We can use the \texttt{figure{*}} environment in \LaTeX{} so that figures can span over two columns. Because the output hooks use the \textbf{framed} package which does not work well with the \texttt{figure{*}} environment, we can either modify the output hooks or use other packages like \textbf{listings}. For example, <>= <> @ \begin{figure*} <>= x=rnorm(100) par(mar=c(4,4,.1,.1)) boxplot(x) hist(x,main='') @ \caption{Two plots spanning over two columns.} \end{figure*} The output PDF file will be like: \url{https://github.com/yihui/knitr/releases/download/doc/knitr-twocolumn.pdf}. The Rnw source of this document is at \url{https://github.com/yihui/knitr/blob/master/inst/examples/knitr-twocolumn.Rnw}. \end{document} knitr/inst/examples/upload-github.R0000644000175100001440000000366113142522202017100 0ustar hornikusersrm(list = ls(all.names = TRUE)) options(stringsAsFactors = FALSE) FILES = c( list.files('.', '.pdf$'), '../../../knitr-book2/DDR-Yihui-Xie-Chap1-3.pdf' ) i = file.exists(FILES) if (!all(i)) stop('These files do not exist: ', paste(FILES[!i], collapse = ', ')) counts = data.frame(file = basename(FILES), count = 0) if (file.exists('download_count.csv')) { counts = rbind(counts, read.csv('download_count.csv')) counts = counts[order(counts$file, counts$count, decreasing = TRUE), ] counts = counts[!duplicated(counts$file), ] } rownames(counts) = FILES[match(basename(FILES), counts$file)] library(httr) token = Sys.getenv('GH_TOKEN', NA) if (is.na(token)) stop('GH_TOKEN not found') a = authenticate(token, "x-oauth-basic", "basic") GET = function(...) { r = httr::GET(..., a) stop_for_status(r) r } DELETE = function(...) { r = httr::DELETE(..., a) stop_for_status(r) r } POST = function(...) { r = httr::POST(..., a) stop_for_status(r) r } r = GET('https://api.github.com/repos/yihui/knitr/releases') x = content(r, 'parsed') for (i in x) { if (i$tag_name == 'doc') { r_url = i$url r_upload = i$upload_url break } } r = GET(r_url) x = content(r, 'parsed') # delete assets that already exist for (i in x$assets) { j = match(i$name, counts$file) if (is.na(j)) next if (i$size == file.info(rownames(counts)[j])[, 'size']) { FILES = setdiff(FILES, rownames(counts)[j]) message(i$name, ' probably not changed') next } counts[j, 2] = counts[j, 2] + i$download_count message('deleting ', i$name) DELETE(i$url) Sys.sleep(1) } # update download counts counts = counts[order(counts$file), , drop = FALSE] write.csv(counts, 'download_count.csv', row.names = FALSE) # upload files for (f in FILES) { message('uploading ', f) POST( sub('{?name,label}', '', r_upload, fixed = TRUE), query = list(name = basename(f)), body = upload_file(f, mime::guess_type(f)) ) Sys.sleep(1) } q('no') knitr/inst/examples/knitr-latex.Rtex0000644000175100001440000000010713142522202017307 0ustar hornikusersSee https://github.com/yihui/knitr-examples/blob/master/005-latex.Rtex knitr/inst/examples/knitr-manual.bib0000644000175100001440000000107512643250451017277 0ustar hornikusers@inproceedings{leisch2002, title={Sweave: Dynamic Generation of Statistical Reports Using Literate Data Analysis}, author={Leisch, F.}, booktitle={COMPSTAT 2002 Proceedings in Computational Statistics}, number={69}, pages={575--580}, year={2002}, organization={Physica Verlag, Heidelberg} } @book{xie2013, title = {Dynamic Documents with {R} and knitr}, author = {Yihui Xie}, publisher = {Chapman and Hall/CRC}, address = {Boca Raton, Florida}, year = {2015}, edition = {2nd}, note = {ISBN 978-1498716963}, url = {http://yihui.name/knitr/} } knitr/inst/examples/knitr-minimal.Rrst0000644000175100001440000000011113142522202017623 0ustar hornikusersSee https://github.com/yihui/knitr-examples/blob/master/006-minimal.Rrst knitr/inst/examples/knitr-graphics.lyx0000644000175100001440000007665613142522202017712 0ustar hornikusers#LyX 2.1 created this file. For more info see http://www.lyx.org/ \lyxformat 474 \begin_document \begin_header \textclass tufte-handout \begin_preamble \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \usepackage[buttonsize=1em]{animate} \end_preamble \options justified \use_default_options true \begin_modules knitr \end_modules \maintain_unincluded_children false \language english \language_package none \inputencoding default \fontencoding global \font_roman default \font_sans default \font_typewriter default \font_math auto \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref true \pdf_bookmarks true \pdf_bookmarksnumbered true \pdf_bookmarksopen true \pdf_bookmarksopenlevel 2 \pdf_breaklinks true \pdf_pdfborder false \pdf_colorlinks false \pdf_backref false \pdf_pdfusetitle true \pdf_quoted_options "pdfstartview=FitH" \papersize default \use_geometry true \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 1 \use_package mathtools 1 \use_package mhchem 1 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine basic \cite_engine_type default \biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 1 \index Index \shortcut idx \color #008000 \end_index \secnumdepth 2 \tocdepth 2 \paragraph_separation indent \paragraph_indentation default \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(knitr) \end_layout \begin_layout Plain Layout options(formatR.arrow=TRUE,width=50) \end_layout \begin_layout Plain Layout opts_chunk$set(fig.path='figure/graphics-', cache.path='cache/graphics-', fig.align='center', dev='tikz', fig.width=5, fig.height=5, fig.show='hold', cache=TRUE, par=TRUE) \end_layout \begin_layout Plain Layout knit_hooks$set(par=function(before, options, envir){ \end_layout \begin_layout Plain Layout if (before && options$fig.show!='none') par(mar=c(4,4,.1,.1),cex.lab=.95,cex.axis=.9,mg p=c(2,.7,0),tcl=-.3) \end_layout \begin_layout Plain Layout }, crop=hook_pdfcrop) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Title knitr Graphics Manual \end_layout \begin_layout Author Yihui Xie \end_layout \begin_layout Abstract This manual shows features of graphics in the \series bold knitr \series default package (version \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash Sexpr{packageVersion('knitr')} \end_layout \end_inset ) in detail, including the graphical devices, plot recording, plot rearrangement , control of plot sizes, the tikz device, figure captions, animations and other types of plots such as \series bold rgl \series default or GGobi plots. \end_layout \begin_layout Standard Before reading this specific manual \begin_inset Foot status open \begin_layout Plain Layout \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://bit.ly/knitr-graphics-src \end_layout \end_inset (Rnw source) \end_layout \end_inset , you must have finished the main manual \begin_inset Foot status open \begin_layout Plain Layout \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://bit.ly/knitr-main \end_layout \end_inset \end_layout \end_inset . \end_layout \begin_layout Section Graphical Devices \end_layout \begin_layout Standard The \series bold knitr \series default package comes with more than 20 built-in graphical devices, and you can specify them through the \family typewriter dev \family default option. This document uses the global option \family typewriter dev='tikz' \family default , i.e., the plots are recorded by the tikz device by default, but we can change the device locally. Since tikz will be used extensively throughout this manual and you will see plenty of tikz graphics later, now we first show a few other devices. \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout with(trees, symbols(Height, Volume, circles = Girth/16, inches = FALSE, bg = 'deeppink', fg = 'gray30')) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Float marginfigure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout The default PDF device. \begin_inset CommandInset label LatexCommand label name "mar:pdf-dev" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Float marginfigure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout The PNG device. \begin_inset CommandInset label LatexCommand label name "mar:png-dev" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Figure \begin_inset CommandInset ref LatexCommand ref reference "mar:pdf-dev" \end_inset and \begin_inset CommandInset ref LatexCommand ref reference "mar:png-dev" \end_inset show two standard devices in the \series bold grDevices \series default package. We can also use devices in the \series bold Cairo \series default or \series bold cairoDevice \series default package, e.g., the chunk below uses the \emph on CairoPNG() \emph default device in the \series bold Cairo \series default package. \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Section Plot Recording \end_layout \begin_layout Standard As mentioned in the main manual, \series bold knitr \series default uses the \series bold evaluate \series default package to record plots. There are two sources of plots: first, whenever \emph on plot.new() \emph default or \emph on grid.newpage() \emph default is called, \series bold evaluate \series default will try to save a snapshot of the current plot \begin_inset Foot status open \begin_layout Plain Layout For technical details, see \family typewriter ?setHook \family default and \family typewriter ?recordPlot \end_layout \end_inset ; second, after each complete expression is evaluated, a snapshot is also saved. To speed up recording, the null graphical device \family typewriter pdf(file = NULL) \family default is used. Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:two-high" \end_inset shows two expressions producing two high-level plots. \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout plot(cars) \end_layout \begin_layout Plain Layout boxplot(cars$dist,xlab='dist') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout Two high-level plots are captured. The key to arrange two plots side by side is to specify the \family typewriter out.width \family default option so that each plot takes less than half of the line width. We do not have to use the \family typewriter par(mfrow) \family default trick, and it may not work in some cases (e.g. to put base graphics and \series bold ggplot2 \series default side by side; recall Figure 1 in the main manual). \begin_inset CommandInset label LatexCommand label name "fig:two-high" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:low-plot-loop" \end_inset shows another example of two R expressions, but the second expression only involves with low-level plotting changes. By default, low-level plot changes are discarded, but you can retain them with the option \family typewriter fig.keep='all' \family default . \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout plot(0,0,type='n',ann=FALSE) \end_layout \begin_layout Plain Layout for(i in seq(0, 2*pi,length=20)) {points(cos(i),sin(i))} \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout Two complete R expressions will produce at most two plots, as long as there are not multiple high-level plotting calls in each expression; option \family typewriter fig.keep='all' \family default here. \begin_inset CommandInset label LatexCommand label name "fig:low-plot-loop" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Together with \family typewriter fig.show='asis' \family default , we can show the process of plotting step by step like Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:high-with-low" \end_inset . \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout plot(cars) \end_layout \begin_layout Plain Layout abline(lm(dist~speed, data=cars)) # a regression line \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout Low-level plot changes in base graphics can be recorded separately, and plots can be put in the places where they were produced. \begin_inset CommandInset label LatexCommand label name "fig:high-with-low" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard A further note on plot recording: \series bold knitr \series default examines all recorded plots (as R objects) and compares them sequentially; if the previous plot is a \begin_inset Quotes eld \end_inset subset \begin_inset Quotes erd \end_inset of the next plot (= previous plot + low-level changes), the previous plot will be removed when \family typewriter fig.keep='high' \family default . If two successive plots are identical, the second one will be removed by default, so it might be a little bit surprising that the following chunk will only produce one plot by default \begin_inset Foot status open \begin_layout Plain Layout adapted from \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://github.com/yihui/knitr/issues/41 \end_layout \end_inset \end_layout \end_inset : \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout m = matrix(1:100, ncol = 10) \end_layout \begin_layout Plain Layout image(m) \end_layout \begin_layout Plain Layout image(m*2) # exactly the same as previous plot \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Section Plot Rearrangement \end_layout \begin_layout Standard We can rearrange the plots in chunks in several ways. They can be inserted right after the line(s) of R code which produced them, or accumulated till the end of the chunk. There is an example in the main manual demonstrating \family typewriter fig.show='asis' \family default for two high-level plots, and Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:high-with-low" \end_inset in this manual also demonstrates this option for a high-level plot followed by a low-level change. \end_layout \begin_layout Standard Here is an example demonstrating the option \family typewriter fig.keep='last' \family default (only the last plot is kept): \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(ggplot2) \end_layout \begin_layout Plain Layout pie <- ggplot(diamonds, aes(x = factor(1), fill = cut)) + xlab('cut') + geom_bar(width = 1) \end_layout \begin_layout Plain Layout pie + coord_polar(theta = "y") # a pie chart \end_layout \begin_layout Plain Layout pie + coord_polar() # the bullseye chart \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout Two plots were produced in this chunk, but only the last one is kept. This can be useful when we experiment with many plots, but only want the last result. (Adapted from the \series bold ggplot2 \series default website) \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard When multiple plots are produced by a code chunk, we may want to show them as an animation with the option \family typewriter fig.show='animate' \family default . Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:clock-animation" \end_inset shows a simple clock animation; you may compare the code to Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:high-with-low" \end_inset to understand that high-level plots are always recorded, regardless of where they appeared. \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout par(mar = rep(3, 4)) \end_layout \begin_layout Plain Layout for (i in seq(pi/2, -4/3 * pi, length = 12)) { \end_layout \begin_layout Plain Layout plot(0, 0, pch = 20, ann = FALSE, axes = FALSE) \end_layout \begin_layout Plain Layout arrows(0, 0, cos(i), sin(i)) \end_layout \begin_layout Plain Layout axis(1, 0, "VI"); axis(2, 0, "IX") \end_layout \begin_layout Plain Layout axis(3, 0, "XII"); axis(4, 0, "III"); box() \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout A clock animation. You have to view it in Adobe Reader: click to play/pause; there are also buttons to speed up or slow down the animation. \begin_inset CommandInset label LatexCommand label name "fig:clock-animation" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard We can also set the alignment of plots easily with the \family typewriter fig.align \family default option; this document uses \family typewriter fig.align='center' \family default as a global option, and we can also set plots to be left/right-aligned. Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:maruko-plot" \end_inset is an example of a left-aligned plot. \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout stars(cbind(1:16,10*(16:1)),draw.segments=TRUE) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout A left-aligned plot adapted from \family typewriter ?stars \family default (I call this the \begin_inset Quotes eld \end_inset Maruko \begin_inset Quotes erd \end_inset plot, and it is one of my favorites; see \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://en.wikipedia.org/wiki/Chibi_Maruko-chan \end_layout \end_inset ). \begin_inset CommandInset label LatexCommand label name "fig:maruko-plot" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Section Plot Size \end_layout \begin_layout Standard We have seen several examples in which two or more plots can be put side by side, and this is because the plots were resized in the output document; with the chunk option \family typewriter out.width \family default less than half of the line width, LaTeX will arrange two plots in one line; if it is less than \begin_inset Formula $1/3$ \end_inset of the line width, three plots can be put in one line. Of course we can also set it to be an absolute width like \family typewriter 3in \family default (3 inches). This option is used extensively in this document to control the size of plots in the output document. \end_layout \begin_layout Section The tikz Device \end_layout \begin_layout Standard The main advantage of using tikz graphics is the consistency of styles between texts in plots and those in the main document. Since we can use native LaTeX commands in plots, the styles of texts in plots can be very sophisticated (see Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:math-formula-tt" \end_inset for an example). \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout plot(0:1,0:1,type='n', ylab='origin of statistics', xlab='statistical presentati on rocks with \backslash \backslash LaTeX{}') \end_layout \begin_layout Plain Layout text(.5,c(.8,.5,.2), c(' \backslash \backslash texttt{lm(y \backslash \backslash textasciitilde{} x)}', '$ \backslash \backslash hat{ \backslash \backslash beta}=(X^{ \backslash \backslash prime}X)^{-1}X^{ \backslash \backslash prime}y$', '$( \backslash \backslash Omega, \backslash \backslash mathcal{F}, \backslash \backslash mu)$')) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout A plot created by \series bold tikzDevice \series default with math expressions and typewriter fonts. Note the font style consistency -- we write the same expressions in LaTeX here: \begin_inset Formula $\hat{\beta}=(X^{\prime}X)^{-1}X^{\prime}y$ \end_inset and \begin_inset Formula $(\Omega,\mathcal{F},\mu)$ \end_inset ; also \family typewriter lm(y ~ x) \family default . \begin_inset CommandInset label LatexCommand label name "fig:math-formula-tt" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard When using XeLaTeX instead of PDFLaTeX to compile the document, we need to tell the \series bold tikzDevice \series default package by setting the \family typewriter tikzDefaultEngine \family default option before all plot chunks (preferably in the first chunk): \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout options(tikzDefaultEngine='xetex') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard This is useful and often necessary to compile tikz plots which contain (UTF8) multi-byte characters. \end_layout \begin_layout Section Figure Caption \end_layout \begin_layout Standard If the chunk option \family typewriter fig.cap \family default is not \family typewriter NULL \family default or \family typewriter NA \family default , the plots will be put in a \family typewriter figure \family default environment when the output format is LaTeX, and this option is used to write a caption in this environment using \family typewriter \backslash caption{} \family default . The other two related options are \family typewriter fig.scap \family default and \family typewriter fig.lp \family default which set the short caption and a prefix string for the figure label. The default short caption is extracted from the caption by truncating it at the first period or colon or semi-colon. The label is a combination of \family typewriter fig.lp \family default and the chunk label. Because \family typewriter figure \family default is a float environment, it can float away from the chunk output to other places such as the top or bottom of a page when the TeX document is compiled. \end_layout \begin_layout Section Other Features \end_layout \begin_layout Standard The \series bold knitr \series default package can be extended with hook functions, and here I give a few examples illustrating the flexibility. \end_layout \begin_layout Subsection Cropping PDF Graphics \end_layout \begin_layout Standard Some R users may have been suffering from the extra margins in R plots, especially in base graphics ( \series bold ggplot2 \series default is much better in this aspect). The default graphical option \family typewriter mar \family default is about \family typewriter c(5, 4, 4, 2) \family default (see \family typewriter ?par \family default ), which is often too big. Instead of endlessly setting \family typewriter par(mar) \family default , you may consider the program \family typewriter pdfcrop \family default , which can crop the white margin automatically \begin_inset Foot status open \begin_layout Plain Layout \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://www.ctan.org/pkg/pdfcrop \end_layout \end_inset \end_layout \end_inset . In \series bold knitr \series default , we can set up the hook \emph on hook_pdfcrop() \emph default to work with a chunk option, say, \family typewriter crop \family default . \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout knit_hooks$set(crop=hook_pdfcrop) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Now we compare two plots below. The first one is not cropped (Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:pdf-nocrop" \end_inset ); then the same plot is produced but with a chunk option \family typewriter crop=TRUE \family default which will call the cropping hook (Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:pdf-crop" \end_inset ). \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout \backslash begin{kframe} \end_layout \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout par(mar=c(5,4,4,2),bg='white') # large margin \end_layout \begin_layout Plain Layout plot(lat~long,data=quakes,pch=20,col=rgb(0,0,0,.2)) \end_layout \begin_layout Plain Layout @ \end_layout \begin_layout Plain Layout \backslash end{kframe} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout The original plot produced in R, with a large margin. \begin_inset CommandInset label LatexCommand label name "fig:pdf-nocrop" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout \backslash begin{kframe} \end_layout \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout @ \end_layout \begin_layout Plain Layout \backslash end{kframe} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout The cropped plot; it fits better in the document. \begin_inset CommandInset label LatexCommand label name "fig:pdf-crop" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard As we can see, the white margins are gone. If we use \emph on par() \emph default , it might be hard and tedious to figure out a reasonable amount of margin in order that neither is any label cropped nor do we get a too large margin. My experience is that \family typewriter pdfcrop \family default works well with base graphics, but barely works with \series bold grid \series default graphics (therefore \series bold lattice \series default and \series bold ggplot2 \series default are ruled out). \end_layout \begin_layout Subsection Manually Saved Plots \end_layout \begin_layout Standard We have explained how R plots are recorded before. In some cases, it is not possible to capture plots by \emph on recordPlot() \emph default (such as \series bold rgl \series default plots), but we can save them using other functions. To insert these plots into the output, we need to set up a hook first like this (see \family typewriter ?hook_plot_custom \family default for details): \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout knit_hooks$set(custom.plot = hook_plot_custom) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Then we set the chunk option \family typewriter custom.plot=TRUE \family default , and manually write plot files in the chunk. Here we show an example of capturing GGobi plots using the function \emph on ggobi_display_save_picture() \emph default in the \series bold rggobi \series default package: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(rggobi) \end_layout \begin_layout Plain Layout ggobi(ggobi_find_file('data', 'flea.csv')) \end_layout \begin_layout Plain Layout Sys.sleep(1) # wait for snapshot \end_layout \begin_layout Plain Layout ggobi_display_save_picture(path=fig_path('.png')) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard One thing to note here is we have to make sure the plot filename is from \emph on fig_path() \emph default , which is a convenience function to return the figure path for the current chunk. \end_layout \begin_layout Standard We can do whatever normal R plots can do with this hook, and we give another example below to show how to work with animations. \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(animation) # adapted from demo('rgl_animation') \end_layout \begin_layout Plain Layout data(pollen) \end_layout \begin_layout Plain Layout uM = matrix(c(-0.37, -0.51, -0.77, 0, -0.73, 0.67, -0.1, 0, 0.57, 0.53, -0.63, 0, 0, 0, 0, 1), 4, 4) \end_layout \begin_layout Plain Layout library(rgl) \end_layout \begin_layout Plain Layout open3d(userMatrix = uM, windowRect = c(0, 0, 400, 400)) \end_layout \begin_layout Plain Layout plot3d(pollen[, 1:3]) \end_layout \begin_layout Plain Layout zm = seq(1, 0.05, length = 20) \end_layout \begin_layout Plain Layout par3d(zoom = 1) # change the zoom factor gradually later \end_layout \begin_layout Plain Layout for (i in 1:length(zm)) { \end_layout \begin_layout Plain Layout par3d(zoom = zm[i]); Sys.sleep(.05) \end_layout \begin_layout Plain Layout rgl.snapshot(fig_path('png', number = i)) \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Subsection rgl Plots \end_layout \begin_layout Standard With the hook \emph on hook_rgl() \emph default , we can easily save snapshots from the \series bold rgl \series default package. We have shown an example in the main manual, and here we add some details. The rgl hook is a good example of taking care of details by carefully using the \family typewriter options \family default argument in the hook; for example, we cannot directly set the width and height of rgl plots in \emph on rgl.snapshot() \emph default or \emph on rgl.postscript() \emph default , so we make use of the options \family typewriter fig.width \family default , \family typewriter fig.height \family default and \family typewriter dpi \family default to calculate the expected size of the window, then resize the current window by \emph on par3d() \emph default , and finally save the plot. \end_layout \begin_layout Standard This hook is actually built upon \emph on hook_plot_custom() \emph default -- first it saves the \series bold rgl \series default snapshot, then it calls \emph on hook_plot_custom() \emph default to write the output code. \end_layout \begin_layout Section \start_of_appendix How to Compile This Manual \end_layout \begin_layout Standard This manual has a long chain of dependencies, so it may not be easy to compile. These packages are required (all of them are free software): \end_layout \begin_layout Description R Cairo, ggplot2, tikzDevice, rgl, rggobi, animation (all available on CRAN except tikzDevice which is on R-Forge for the time being) \end_layout \begin_layout Description LaTeX animate, hyperref and the tufte-handout class \end_layout \begin_layout Description Other GGobi, pdfcrop \end_layout \end_body \end_document knitr/inst/examples/knitr-beamer.Rnw0000644000175100001440000000677613142522202017273 0ustar hornikusers%% LyX 2.2.1 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass[10pt]{beamer} \usepackage[T1]{fontenc} \setcounter{secnumdepth}{3} \setcounter{tocdepth}{3} \usepackage{url} \ifx\hypersetup\undefined \AtBeginDocument{% \hypersetup{unicode=true,pdfusetitle, bookmarks=true,bookmarksnumbered=false,bookmarksopen=false, breaklinks=false,pdfborder={0 0 0},pdfborderstyle={},backref=false,colorlinks=false} } \else \hypersetup{unicode=true,pdfusetitle, bookmarks=true,bookmarksnumbered=false,bookmarksopen=false, breaklinks=false,pdfborder={0 0 0},pdfborderstyle={},backref=false,colorlinks=false} \fi \usepackage{breakurl} \makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands. \providecommand{\LyX}{\texorpdfstring% {L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX\@} {LyX}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Textclass specific LaTeX commands. % this default might be overridden by plain title style \newcommand\makebeamertitle{\frame{\maketitle}}% % (ERT) argument for the TOC \AtBeginDocument{% \let\origtableofcontents=\tableofcontents \def\tableofcontents{\@ifnextchar[{\origtableofcontents}{\gobbletableofcontents}} \def\gobbletableofcontents#1{\origtableofcontents} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. \usetheme{PaloAlto} \makeatother \begin{document} <>= library(knitr) opts_chunk$set(fig.path='figure/beamer-',fig.align='center',fig.show='hold',size='footnotesize') @ \title[knitr, Beamer, and FragileFrame]{A Minimal Demo of knitr with Beamer and Fragile Frames} \author{Yihui Xie\thanks{I thank Richard E. Goldberg for providing this demo.}} \makebeamertitle \begin{frame}{Background} \begin{itemize} \item The \textbf{knitr}\textbf{\emph{ }}package allows you to embed R code and figures in \LaTeX{} documents \begin{itemize} \item It has functionality similar to Sweave but looks nicer and gives you more control \end{itemize} \item If you already have Sweave working in \LyX{}, getting \textbf{knitr} to work is trivial \begin{enumerate} \item Install the \textbf{knitr} package in \emph{R} \item Read \url{https://yihui.name/knitr/demo/lyx/} \end{enumerate} \item If you use Sweave or \textbf{knitr} with Beamer in \LyX{}, you must use the\emph{ FragileFrame} environment for the frames that contain R code chunks. Let's see if \textbf{knitr} works with Beamer in this small demo. \end{itemize} \end{frame} \section{First Test} \begin{frame}[fragile]{First Test} OK, let's get started with just some text: <>= # some setup options(width=60) # make the printing fit on the page set.seed(1121) # make the results repeatable @ <<>>= # create some random numbers (x=rnorm(20)) mean(x);var(x) @ BTW, the first element of \texttt{x} is \Sexpr{x[1]}. (Did you notice the use of\texttt{ \textbackslash{}Sexpr\{\}}?) \end{frame} \section{Second Test} \begin{frame}[fragile]{Second Test} Text is nice but let's see what happens if we make a couple of plots in our chunk: <>= par(las=1,mar=c(4,4,.1,.1)) # tick labels direction boxplot(x) hist(x,main='',col="blue",probability=TRUE) lines(density(x),col="red") @ \end{frame} \section{The Big Question} \begin{frame}{The Big Question} Do the above chunks work? You should be able to compile the \LyX{} document and get a nice-looking PDF slide presentation. If not, time to double-check everything... \end{frame} \end{document} knitr/inst/examples/knitr-subfloats.lyx0000644000175100001440000001145513142522202020076 0ustar hornikusers#LyX 2.0 created this file. For more info see http://www.lyx.org/ \lyxformat 413 \begin_document \begin_header \textclass article \begin_preamble \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \end_preamble \use_default_options true \begin_modules knitr \end_modules \maintain_unincluded_children false \language english \language_package default \inputencoding auto \fontencoding global \font_roman default \font_sans default \font_typewriter default \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref false \papersize default \use_geometry false \use_amsmath 1 \use_esint 1 \use_mhchem 1 \use_mathdots 1 \cite_engine basic \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \use_refstyle 1 \index Index \shortcut idx \color #008000 \end_index \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(knitr) \end_layout \begin_layout Plain Layout opts_chunk$set(fig.path='figure/subfloats-') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Title Using subfloats in LyX with knitr \end_layout \begin_layout Author Yihui Xie \end_layout \begin_layout Standard If you insert a float figure inside a float figure in LyX, you will get subfloats. To make sure the two subfloats can stand side by side, you have to: \end_layout \begin_layout Enumerate remove new lines between the two subfloat environments in LyX (if you are not sure if there are blank lines between them, check the LaTeX source); \end_layout \begin_layout Enumerate use the chunk option \family typewriter echo=FALSE \family default to hide the R source code in the output; \end_layout \begin_layout Enumerate set \family typewriter out.width \family default to be less than half of the linewidth if you do not want the sub figures to exceed the page margin; \end_layout \begin_layout Enumerate most importantly, leave a blank line in the beginning of the subfloat environmen t, so that \family typewriter <<>>= \family default starts in a new line and \series bold knitr \series default can recognize it; \end_layout \begin_layout Standard Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:knitr-subfloat" \end_inset is an example. \end_layout \begin_layout Standard This document was compiled with \series bold knitr \series default \begin_inset ERT status open \begin_layout Plain Layout \backslash Sexpr{packageVersion('knitr')} \end_layout \end_inset . Rnw source at \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://github.com/yihui/knitr/blob/master/inst/examples/knitr-subfloats.Rnw \end_layout \end_inset . \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout \end_layout \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout plot(1) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout this is a subfloat \end_layout \end_inset \end_layout \end_inset \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout \end_layout \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout plot(rnorm(100)) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout another float \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout one figure with 2 sub figures \begin_inset CommandInset label LatexCommand label name "fig:knitr-subfloat" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \end_body \end_document knitr/inst/examples/knit-all.R0000755000175100001440000000233013142522202016042 0ustar hornikusers#!/usr/bin/env Rscript if (!nzchar(Sys.which('lyx')) || system('lyx -version') != 0L) q() call_lyx = function(file) { res = sapply(sprintf('lyx -e %s %s', c('knitr', 'r', 'pdf2'), file), system, ignore.stdout = TRUE, USE.NAMES = FALSE) unlink(sub('\\.lyx$', '.R', file)) stopifnot(identical(res, integer(3L))) } for (i in list.files(pattern = '\\.lyx$')) { message(i) call_lyx(i) flush.console() } knit_script = normalizePath('../bin/knit', mustWork = TRUE) knit_cmd = function(file) { paste('Rscript', shQuote(knit_script), shQuote(file)) } test_cmd = function(cmd) { stopifnot(identical(system(cmd, ignore.stdout = TRUE), 0L)) } for (i in list.files(pattern = '\\.Rmd')) { message(i) cmd = if (i == 'knitr-minimal.Rmd') { sprintf("Rscript -e 'library(knitr);opts_knit$set(base.url=\"http://animation.r-forge.r-project.org/ideas/\");knit(\"%s\")'", i) } else knit_cmd(i) test_cmd(cmd) flush.console() } test_cmd(sprintf("Rscript -e 'library(knitr);spin(\"knitr-spin.R\", precious=TRUE)'")) setwd('child') for (i in c('knitr-main.Rnw', 'knitr-parent.Rnw')) { test_cmd(knit_cmd(i)) } unlink('*.tex') test_cmd(knit_cmd('knitr-main.Rmd')) setwd('..') file.remove('child/knitr-main.html') knitr/inst/examples/knitr-minimal.Rmd0000644000175100001440000000225213142522202017423 0ustar hornikusers# A Minimal Example for Markdown This is a minimal example of using **knitr** to produce an _HTML_ page from _Markdown_. ## R code chunks ```{r setup} # set global chunk options: images will be 7x5 inches knitr::opts_chunk$set(fig.width=7, fig.height=5) options(digits = 4) ``` Now we write some code chunks in this markdown file: ```{r computing} x <- 1+1 # a simple calculator set.seed(123) rnorm(5) # boring random numbers ``` We can also produce plots: ```{r graphics} par(mar = c(4, 4, .1, .1)) with(mtcars, { plot(mpg~hp, pch=20, col='darkgray') lines(lowess(hp, mpg)) }) ``` ## Inline code Inline R code is also supported, e.g. the value of `x` is `r x`, and 2 × π = `r 2*pi`. ## Math LaTeX math as usual: $f(\alpha, \beta) \propto x^{\alpha-1}(1-x)^{\beta-1}$. ## Misc You can indent code chunks so they can nest within other environments such as lists. 1. the area of a circle with radius x ```{r foo} pi * x^2 ``` 2. OK, that is great To compile me, use ```{r compile, eval=FALSE} library(knitr) knit('knitr-minimal.Rmd') ``` ## Conclusion Markdown is super easy to write. Go to **knitr** [homepage](https://yihui.name/knitr/) for details. knitr/inst/examples/README.md0000644000175100001440000000023313142522202015460 0ustar hornikusers# knitr-examples To compile the `knitr-graphics` example, look at the bottom of the file [`knitr-graphics.lyx`](knitr-graphics.lyx) for its dependencies. knitr/inst/examples/knitr-input.Rnw0000644000175100001440000000053313142522202017160 0ustar hornikusers\documentclass{article} \begin{document} <>= options(width = 60) summary(iris) @ Let's see how to work with child documents in knitr. Below we input the file \textsf{knitr-input-child.Rnw}: <>= @ % Or alternatively, use knit_child('knitr-input-child.Rnw') in \Sexpr Done! \end{document} knitr/inst/examples/knitr-minimal.Rnw0000644000175100001440000000334313142522202017451 0ustar hornikusers%% LyX 2.2.1 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass{article} \usepackage[sc]{mathpazo} \usepackage[T1]{fontenc} \usepackage{geometry} \geometry{verbose,tmargin=2.5cm,bmargin=2.5cm,lmargin=2.5cm,rmargin=2.5cm} \setcounter{secnumdepth}{2} \setcounter{tocdepth}{2} \usepackage{url} \usepackage[unicode=true,pdfusetitle, bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2, breaklinks=false,pdfborder={0 0 1},backref=false,colorlinks=false] {hyperref} \hypersetup{ pdfstartview={XYZ null null 1}} \usepackage{breakurl} \begin{document} <>= library(knitr) # set global chunk options opts_chunk$set(fig.path='figure/minimal-', fig.align='center', fig.show='hold') options(formatR.arrow=TRUE,width=90) @ \title{A Minimal Demo of knitr} \author{Yihui Xie} \maketitle You can test if \textbf{knitr} works with this minimal demo. OK, let's get started with some boring random numbers: <>= set.seed(1121) (x=rnorm(20)) mean(x);var(x) @ The first element of \texttt{x} is \Sexpr{x[1]}. Boring boxplots and histograms recorded by the PDF device: <>= ## two plots side by side (option fig.show='hold') par(mar=c(4,4,.1,.1),cex.lab=.95,cex.axis=.9,mgp=c(2,.7,0),tcl=-.3,las=1) boxplot(x) hist(x,main='') @ Do the above chunks work? You should be able to compile the \TeX{} document and get a PDF file like this one: \url{https://github.com/yihui/knitr/releases/download/doc/knitr-minimal.pdf}. The Rnw source of this document is at \url{https://github.com/yihui/knitr/blob/master/inst/examples/knitr-minimal.Rnw}. \end{document} knitr/inst/examples/knitr-minimal.lyx0000644000175100001440000001002013142522202017505 0ustar hornikusers#LyX 2.0 created this file. For more info see http://www.lyx.org/ \lyxformat 413 \begin_document \begin_header \textclass article \use_default_options true \begin_modules knitr \end_modules \maintain_unincluded_children false \language english \language_package none \inputencoding default \fontencoding global \font_roman palatino \font_sans default \font_typewriter default \font_default_family default \use_non_tex_fonts false \font_sc true \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref true \pdf_bookmarks true \pdf_bookmarksnumbered true \pdf_bookmarksopen true \pdf_bookmarksopenlevel 2 \pdf_breaklinks false \pdf_pdfborder false \pdf_colorlinks false \pdf_backref false \pdf_pdfusetitle true \pdf_quoted_options "pdfstartview={XYZ null null 1}" \papersize default \use_geometry true \use_amsmath 1 \use_esint 1 \use_mhchem 1 \use_mathdots 1 \cite_engine basic \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \use_refstyle 1 \index Index \shortcut idx \color #008000 \end_index \leftmargin 2.5cm \topmargin 2.5cm \rightmargin 2.5cm \bottommargin 2.5cm \secnumdepth 2 \tocdepth 2 \paragraph_separation indent \paragraph_indentation default \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(knitr) \end_layout \begin_layout Plain Layout # set global chunk options \end_layout \begin_layout Plain Layout opts_chunk$set(fig.path='figure/minimal-', fig.align='center', fig.show='hold') \end_layout \begin_layout Plain Layout options(formatR.arrow=TRUE,width=90) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Title A Minimal Demo of knitr \end_layout \begin_layout Author Yihui Xie \end_layout \begin_layout Standard You can test if \series bold knitr \series default works with this minimal demo. OK, let's get started with some boring random numbers: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout set.seed(1121) \end_layout \begin_layout Plain Layout (x=rnorm(20)) \end_layout \begin_layout Plain Layout mean(x);var(x) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard The first element of \family typewriter x \family default is \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash Sexpr{x[1]} \end_layout \end_inset . Boring boxplots and histograms recorded by the PDF device: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout ## two plots side by side (option fig.show='hold') \end_layout \begin_layout Plain Layout par(mar=c(4,4,.1,.1),cex.lab=.95,cex.axis=.9,mgp=c(2,.7,0),tcl=-.3,las=1) \end_layout \begin_layout Plain Layout boxplot(x) \end_layout \begin_layout Plain Layout hist(x,main='') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Do the above chunks work? You should be able to compile the TeX document and get a PDF file like this one: \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://github.com/yihui/knitr/releases/download/doc/knitr-minimal.pdf \end_layout \end_inset . The Rnw source of this document is at \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://github.com/yihui/knitr/blob/master/inst/examples/knitr-minimal.Rnw \end_layout \end_inset . \end_layout \end_body \end_document knitr/inst/examples/Sweavel.sty0000644000175100001440000000544513010461433016364 0ustar hornikusers% Source: http://biostat.mc.vanderbilt.edu/wiki/pub/Main/SweaveTemplate/Sweavel.sty % Author: Frank Harrell (with slight tweaks by Yihui Xie) % Usage: \usepackage{Sweavel} % To change size of R code and output, use e.g.: \def\Sweavesize{\normalsize} % To change just the size of output, use e.g.: \def\Routsize{\smaller[2]} % To change colors of R code, output, and commands, use e.g.: % \def\Rcolor{\color{black}} % \def\Routcolor{\color{green}} % \def\Rcommentcolor{\color{red}} % To change background color or R code and/or output, use e.g.: % \def\Rbackground{\color{white}} % \def\Routbackground{\color{white}} % To use rgb specifications use \color[rgb]{ , , } % To use gray scale use e.g. \color[gray]{0.5} % If you change any of these after the first chunk is produced, the % changes will have effect only for the next chunk. \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{Sweavel}{} % substitute for Sweave.sty using % listings package with relsize \RequirePackage{listings,fancyvrb,color,relsize} \providecommand{\Sweavesize}{\smaller} \providecommand{\Routsize}{\Sweavesize} \providecommand{\Rcolor}{\color[rgb]{0, 0.5, 0.5}} \providecommand{\Routcolor}{\color[rgb]{0.461, 0.039, 0.102}} \providecommand{\Rcommentcolor}{\color[rgb]{0.101, 0.043, 0.432}} \providecommand{\Rbackground}{\color[gray]{0.91}} \providecommand{\Routbackground}{\color[gray]{0.935}} % Can specify \color[gray]{1} for white background or just \color{white} \lstdefinestyle{Rstyle}{fancyvrb=false,escapechar=`,language=R,% basicstyle={\Rcolor\Sweavesize},% some want \ttfamily too backgroundcolor=\Rbackground,% showstringspaces=false,% keywordstyle=\Rcolor,% commentstyle={\Rcommentcolor\ttfamily\itshape},% literate={<-}{{$\leftarrow$}}2{<<-}{{$\twoheadleftarrow$}}2{~}{{$\sim$}}1{<=}{{$\leq$}}2{>=}{{$\geq$}}2{^}{{$^{\scriptstyle\wedge}$}}1,% alsoother={$},% alsoletter={.<-},% otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,/},% escapeinside={(*}{*)}}% % Other options of interest: % frame=single,framerule=0.1pt,framesep=1pt,rulecolor=\color{blue}, % numbers=left,numberstyle=\tiny,stepnumber=1,numbersep=7pt, % keywordstyle={\bf\Rcolor} \lstdefinestyle{Routstyle}{fancyvrb=false,literate={~}{{$\sim$}}1{R^2}{{$R^{2}$}}2{^}{{$^{\scriptstyle\wedge}$}}1{R-squared}{{$R^{2}$}}2,% frame=single,framerule=0.2pt,framesep=1pt,basicstyle=\Routcolor\Routsize\ttfamily,% backgroundcolor=\Routbackground} \newenvironment{Schunk}{}{} \lstnewenvironment{Sinput}{\lstset{style=Rstyle}}{} \lstnewenvironment{Scode}{\lstset{style=Rstyle}}{} \lstnewenvironment{Soutput}{\lstset{style=Routstyle}}{} knitr/inst/examples/knitr-graphics.Rnw0000644000175100001440000004074313142522202017630 0ustar hornikusers%% LyX 2.2.1 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass[nohyper,justified]{tufte-handout} \usepackage[T1]{fontenc} \usepackage{url} \usepackage[unicode=true,pdfusetitle, bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2, breaklinks=true,pdfborder={0 0 1},backref=false,colorlinks=false] {hyperref} \hypersetup{ pdfstartview=FitH} \usepackage{breakurl} \makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands. \title{knitr Graphics Manual} \author{Yihui Xie} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \usepackage[buttonsize=1em]{animate} \makeatother \begin{document} <>= library(knitr) options(formatR.arrow=TRUE,width=50) opts_chunk$set(fig.path='figure/graphics-', cache.path='cache/graphics-', fig.align='center', dev='tikz', fig.width=5, fig.height=5, fig.show='hold', cache=TRUE, par=TRUE) knit_hooks$set(par=function(before, options, envir){ if (before && options$fig.show!='none') par(mar=c(4,4,.1,.1),cex.lab=.95,cex.axis=.9,mgp=c(2,.7,0),tcl=-.3) }, crop=hook_pdfcrop) @ \maketitle \begin{abstract} This manual shows features of graphics in the \textbf{knitr} package (version \Sexpr{packageVersion('knitr')}) in detail, including the graphical devices, plot recording, plot rearrangement, control of plot sizes, the tikz device, figure captions, animations and other types of plots such as \textbf{rgl} or GGobi plots. \end{abstract} Before reading this specific manual\footnote{\url{http://bit.ly/knitr-graphics-src} (Rnw source)}, you must have finished the main manual\footnote{\url{http://bit.ly/knitr-main}}. \section{Graphical Devices} The \textbf{knitr} package comes with more than 20 built-in graphical devices, and you can specify them through the \texttt{dev} option. This document uses the global option \texttt{dev='tikz'}, i.e., the plots are recorded by the tikz device by default, but we can change the device locally. Since tikz will be used extensively throughout this manual and you will see plenty of tikz graphics later, now we first show a few other devices. <>= with(trees, symbols(Height, Volume, circles = Girth/16, inches = FALSE, bg = 'deeppink', fg = 'gray30')) @ \begin{marginfigure} <>= @ \caption{The default PDF device.\label{mar:pdf-dev}} \end{marginfigure} \begin{marginfigure} <>= @ \caption{The PNG device.\label{mar:png-dev}} \end{marginfigure} Figure \ref{mar:pdf-dev} and \ref{mar:png-dev} show two standard devices in the \textbf{grDevices} package. We can also use devices in the \textbf{Cairo} or \textbf{cairoDevice} package, e.g., the chunk below uses the \emph{CairoPNG()} device in the \textbf{Cairo} package. <>= @ \section{Plot Recording} As mentioned in the main manual, \textbf{knitr} uses the \textbf{evaluate} package to record plots. There are two sources of plots: first, whenever \emph{plot.new()} or \emph{grid.newpage()} is called, \textbf{evaluate} will try to save a snapshot of the current plot\footnote{For technical details, see \texttt{?setHook} and \texttt{?recordPlot}}; second, after each complete expression is evaluated, a snapshot is also saved. To speed up recording, the null graphical device \texttt{pdf(file = NULL)} is used. Figure \ref{fig:two-high} shows two expressions producing two high-level plots. \begin{figure} <>= plot(cars) boxplot(cars$dist,xlab='dist') @ \caption{Two high-level plots are captured. The key to arrange two plots side by side is to specify the \texttt{out.width} option so that each plot takes less than half of the line width. We do not have to use the \texttt{par(mfrow)} trick, and it may not work in some cases (e.g. to put base graphics and \textbf{ggplot2} side by side; recall Figure 1 in the main manual).\label{fig:two-high}} \end{figure} Figure \ref{fig:low-plot-loop} shows another example of two R expressions, but the second expression only involves with low-level plotting changes. By default, low-level plot changes are discarded, but you can retain them with the option \texttt{fig.keep='all'}. \begin{figure} <>= plot(0,0,type='n',ann=FALSE) for(i in seq(0, 2*pi,length=20)) {points(cos(i),sin(i))} @ \caption{Two complete R expressions will produce at most two plots, as long as there are not multiple high-level plotting calls in each expression; option \texttt{fig.keep='all'} here.\label{fig:low-plot-loop}} \end{figure} Together with \texttt{fig.show='asis'}, we can show the process of plotting step by step like Figure \ref{fig:high-with-low}. \begin{figure} <>= plot(cars) abline(lm(dist~speed, data=cars)) # a regression line @ \caption{Low-level plot changes in base graphics can be recorded separately, and plots can be put in the places where they were produced.\label{fig:high-with-low}} \end{figure} A further note on plot recording: \textbf{knitr} examines all recorded plots (as R objects) and compares them sequentially; if the previous plot is a ``subset'' of the next plot (= previous plot + low-level changes), the previous plot will be removed when \texttt{fig.keep='high'}. If two successive plots are identical, the second one will be removed by default, so it might be a little bit surprising that the following chunk will only produce one plot by default\footnote{adapted from \url{https://github.com/yihui/knitr/issues/41}}: <>= m = matrix(1:100, ncol = 10) image(m) image(m*2) # exactly the same as previous plot @ \section{Plot Rearrangement} We can rearrange the plots in chunks in several ways. They can be inserted right after the line(s) of R code which produced them, or accumulated till the end of the chunk. There is an example in the main manual demonstrating \texttt{fig.show='asis'} for two high-level plots, and Figure \ref{fig:high-with-low} in this manual also demonstrates this option for a high-level plot followed by a low-level change. Here is an example demonstrating the option \texttt{fig.keep='last'} (only the last plot is kept): \begin{figure} <>= library(ggplot2) pie <- ggplot(diamonds, aes(x = factor(1), fill = cut)) + xlab('cut') + geom_bar(width = 1) pie + coord_polar(theta = "y") # a pie chart pie + coord_polar() # the bullseye chart @ \caption{Two plots were produced in this chunk, but only the last one is kept. This can be useful when we experiment with many plots, but only want the last result. (Adapted from the \textbf{ggplot2} website)} \end{figure} When multiple plots are produced by a code chunk, we may want to show them as an animation with the option \texttt{fig.show='animate'}. Figure \ref{fig:clock-animation} shows a simple clock animation; you may compare the code to Figure \ref{fig:high-with-low} to understand that high-level plots are always recorded, regardless of where they appeared. \begin{figure} <>= par(mar = rep(3, 4)) for (i in seq(pi/2, -4/3 * pi, length = 12)) { plot(0, 0, pch = 20, ann = FALSE, axes = FALSE) arrows(0, 0, cos(i), sin(i)) axis(1, 0, "VI"); axis(2, 0, "IX") axis(3, 0, "XII"); axis(4, 0, "III"); box() } @ \caption{A clock animation. You have to view it in Adobe Reader: click to play/pause; there are also buttons to speed up or slow down the animation.\label{fig:clock-animation}} \end{figure} We can also set the alignment of plots easily with the \texttt{fig.align} option; this document uses \texttt{fig.align='center'} as a global option, and we can also set plots to be left/right-aligned. Figure \ref{fig:maruko-plot} is an example of a left-aligned plot. \begin{figure} <>= stars(cbind(1:16,10*(16:1)),draw.segments=TRUE) @ \caption{A left-aligned plot adapted from \texttt{?stars} (I call this the ``Maruko'' plot, and it is one of my favorites; see \protect\url{http://en.wikipedia.org/wiki/Chibi_Maruko-chan}).\label{fig:maruko-plot}} \end{figure} \section{Plot Size} We have seen several examples in which two or more plots can be put side by side, and this is because the plots were resized in the output document; with the chunk option \texttt{out.width} less than half of the line width, \LaTeX{} will arrange two plots in one line; if it is less than $1/3$ of the line width, three plots can be put in one line. Of course we can also set it to be an absolute width like \texttt{3in} (3 inches). This option is used extensively in this document to control the size of plots in the output document. \section{The tikz Device} The main advantage of using tikz graphics is the consistency of styles between texts in plots and those in the main document. Since we can use native \LaTeX{} commands in plots, the styles of texts in plots can be very sophisticated (see Figure \ref{fig:math-formula-tt} for an example). \begin{figure} <>= plot(0:1,0:1,type='n', ylab='origin of statistics', xlab='statistical presentation rocks with \\LaTeX{}') text(.5,c(.8,.5,.2), c('\\texttt{lm(y \\textasciitilde{} x)}', '$\\hat{\\beta}=(X^{\\prime}X)^{-1}X^{\\prime}y$', '$(\\Omega,\\mathcal{F},\\mu)$')) @ \caption{A plot created by \textbf{tikzDevice} with math expressions and typewriter fonts. Note the font style consistency \textendash{} we write the same expressions in \protect\LaTeX{} here: $\hat{\beta}=(X^{\prime}X)^{-1}X^{\prime}y$ and $(\Omega,\mathcal{F},\mu)$; also \texttt{lm(y \textasciitilde{} x)}.\label{fig:math-formula-tt}} \end{figure} When using Xe\LaTeX{} instead of PDF\LaTeX{} to compile the document, we need to tell the \textbf{tikzDevice} package by setting the \texttt{tikzDefaultEngine} option before all plot chunks (preferably in the first chunk): <>= options(tikzDefaultEngine='xetex') @ This is useful and often necessary to compile tikz plots which contain (UTF8) multi-byte characters. \section{Figure Caption} If the chunk option \texttt{fig.cap} is not \texttt{NULL} or \texttt{NA}, the plots will be put in a \texttt{figure} environment when the output format is \LaTeX{}, and this option is used to write a caption in this environment using \texttt{\textbackslash{}caption\{\}}. The other two related options are \texttt{fig.scap} and \texttt{fig.lp} which set the short caption and a prefix string for the figure label. The default short caption is extracted from the caption by truncating it at the first period or colon or semi-colon. The label is a combination of \texttt{fig.lp} and the chunk label. Because \texttt{figure} is a float environment, it can float away from the chunk output to other places such as the top or bottom of a page when the \TeX{} document is compiled. \section{Other Features} The \textbf{knitr} package can be extended with hook functions, and here I give a few examples illustrating the flexibility. \subsection{Cropping PDF Graphics} Some R users may have been suffering from the extra margins in R plots, especially in base graphics (\textbf{ggplot2} is much better in this aspect). The default graphical option \texttt{mar} is about \texttt{c(5, 4, 4, 2)} (see \texttt{?par}), which is often too big. Instead of endlessly setting \texttt{par(mar)}, you may consider the program \texttt{pdfcrop}, which can crop the white margin automatically\footnote{\url{http://www.ctan.org/pkg/pdfcrop}}. In \textbf{knitr}, we can set up the hook \emph{hook\_pdfcrop()} to work with a chunk option, say, \texttt{crop}. <>= knit_hooks$set(crop=hook_pdfcrop) @ Now we compare two plots below. The first one is not cropped (Figure \ref{fig:pdf-nocrop}); then the same plot is produced but with a chunk option \texttt{crop=TRUE} which will call the cropping hook (Figure \ref{fig:pdf-crop}). \begin{figure} \begin{kframe} <>= par(mar=c(5,4,4,2),bg='white') # large margin plot(lat~long,data=quakes,pch=20,col=rgb(0,0,0,.2)) @ \end{kframe} \caption{The original plot produced in R, with a large margin.\label{fig:pdf-nocrop}} \end{figure} \begin{figure} \begin{kframe} <>= @ \end{kframe} \caption{The cropped plot; it fits better in the document.\label{fig:pdf-crop}} \end{figure} As we can see, the white margins are gone. If we use \emph{par()}, it might be hard and tedious to figure out a reasonable amount of margin in order that neither is any label cropped nor do we get a too large margin. My experience is that \texttt{pdfcrop} works well with base graphics, but barely works with \textbf{grid} graphics (therefore \textbf{lattice} and \textbf{ggplot2} are ruled out). \subsection{Manually Saved Plots} We have explained how R plots are recorded before. In some cases, it is not possible to capture plots by \emph{recordPlot()} (such as \textbf{rgl} plots), but we can save them using other functions. To insert these plots into the output, we need to set up a hook first like this (see \texttt{?hook\_plot\_custom} for details): <>= knit_hooks$set(custom.plot = hook_plot_custom) @ Then we set the chunk option \texttt{custom.plot=TRUE}, and manually write plot files in the chunk. Here we show an example of capturing GGobi plots using the function \emph{ggobi\_display\_save\_picture()} in the \textbf{rggobi} package: <>= library(rggobi) ggobi(ggobi_find_file('data', 'flea.csv')) Sys.sleep(1) # wait for snapshot ggobi_display_save_picture(path=fig_path('.png')) @ One thing to note here is we have to make sure the plot filename is from \emph{fig\_path()}, which is a convenience function to return the figure path for the current chunk. We can do whatever normal R plots can do with this hook, and we give another example below to show how to work with animations. <>= library(animation) # adapted from demo('rgl_animation') data(pollen) uM = matrix(c(-0.37, -0.51, -0.77, 0, -0.73, 0.67, -0.1, 0, 0.57, 0.53, -0.63, 0, 0, 0, 0, 1), 4, 4) library(rgl) open3d(userMatrix = uM, windowRect = c(0, 0, 400, 400)) plot3d(pollen[, 1:3]) zm = seq(1, 0.05, length = 20) par3d(zoom = 1) # change the zoom factor gradually later for (i in 1:length(zm)) { par3d(zoom = zm[i]); Sys.sleep(.05) rgl.snapshot(fig_path('png', number = i)) } @ \subsection{rgl Plots} With the hook \emph{hook\_rgl()}, we can easily save snapshots from the \textbf{rgl} package. We have shown an example in the main manual, and here we add some details. The rgl hook is a good example of taking care of details by carefully using the \texttt{options} argument in the hook; for example, we cannot directly set the width and height of rgl plots in \emph{rgl.snapshot()} or \emph{rgl.postscript()}, so we make use of the options \texttt{fig.width}, \texttt{fig.height} and \texttt{dpi} to calculate the expected size of the window, then resize the current window by \emph{par3d()}, and finally save the plot. This hook is actually built upon \emph{hook\_plot\_custom()} \textendash{} first it saves the \textbf{rgl} snapshot, then it calls \emph{hook\_plot\_custom()} to write the output code. \appendix \section{How to Compile This Manual} This manual has a long chain of dependencies, so it may not be easy to compile. These packages are required (all of them are free software): \begin{description} \item [{R}] Cairo, ggplot2, tikzDevice, rgl, rggobi, animation (all available on CRAN except tikzDevice which is on R-Forge for the time being) \item [{\LaTeX{}}] animate, hyperref and the tufte-handout class \item [{Other}] GGobi, pdfcrop \end{description} \end{document} knitr/inst/examples/knitr-twocolumn.lyx0000644000175100001440000001021513142522202020114 0ustar hornikusers#LyX 2.0 created this file. For more info see http://www.lyx.org/ \lyxformat 413 \begin_document \begin_header \textclass article \begin_preamble \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \end_preamble \use_default_options true \begin_modules knitr \end_modules \maintain_unincluded_children false \language english \language_package none \inputencoding default \fontencoding global \font_roman palatino \font_sans default \font_typewriter default \font_default_family default \use_non_tex_fonts false \font_sc true \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref true \pdf_bookmarks true \pdf_bookmarksnumbered true \pdf_bookmarksopen true \pdf_bookmarksopenlevel 2 \pdf_breaklinks false \pdf_pdfborder false \pdf_colorlinks false \pdf_backref false \pdf_pdfusetitle true \pdf_quoted_options "pdfstartview={XYZ null null 1}" \papersize default \use_geometry true \use_amsmath 1 \use_esint 1 \use_mhchem 1 \use_mathdots 1 \cite_engine basic \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \use_refstyle 1 \index Index \shortcut idx \color #008000 \end_index \leftmargin 3cm \topmargin 3cm \rightmargin 3cm \bottommargin 3cm \secnumdepth 2 \tocdepth 2 \paragraph_separation skip \defskip bigskip \quotes_language english \papercolumns 2 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(knitr) \end_layout \begin_layout Plain Layout opts_chunk$set(fig.path='figure/twocolumn-', fig.align='center', fig.show='hold') \end_layout \begin_layout Plain Layout render_listings() \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Title Using knitr in A Two-column Document \end_layout \begin_layout Author Yihui Xie \end_layout \begin_layout Standard We can use the \family typewriter figure* \family default environment in LaTeX so that figures can span over two columns. Because the output hooks use the \series bold framed \series default package which does not work well with the \family typewriter figure* \family default environment, we can either modify the output hooks or use other packages like \series bold listings \series default . For example, \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout <> \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Float figure wide true sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout x=rnorm(100) \end_layout \begin_layout Plain Layout par(mar=c(4,4,.1,.1)) \end_layout \begin_layout Plain Layout boxplot(x) \end_layout \begin_layout Plain Layout hist(x,main='') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Two plots spanning over two columns. \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard The output PDF file will be like: \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://github.com/yihui/knitr/releases/download/doc/knitr-twocolumn.pdf \end_layout \end_inset . The Rnw source of this document is at \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://github.com/yihui/knitr/blob/master/inst/examples/knitr-twocolumn.Rnw \end_layout \end_inset . \end_layout \end_body \end_document knitr/inst/examples/knitr-themes.Rnw0000644000175100001440000000772413142522202017317 0ustar hornikusers%% LyX 2.2.1 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass[nohyper,justified]{tufte-handout} \usepackage[T1]{fontenc} \usepackage{url} \makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands. \title{Customizing Syntax Highlighting Themes} \author{Yihui Xie \& Ramnath Vaidyanathan} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \usepackage[breaklinks=true,pdfstartview=FitH]{hyperref} \makeatother \begin{document} <>= library(knitr) opts_chunk$set(fig.path='figure/theme-', cache.path='cache/theme-', cache=TRUE) options(formatR.arrow=TRUE,width=78) knit_hooks$set(par=function(before, options, envir){if (before) par(mar=c(4,4,.1,.1),cex.lab=.95,cex.axis=.9,mgp=c(2,.7,0),tcl=-.3)}) @ <>= thm = knit_theme$get("solarized-dark") knit_theme$set(thm) @ \maketitle \begin{abstract} This manual\footnote{source code at \url{https://github.com/yihui/knitr/blob/master/inst/examples/knitr-themes.Rnw}} shows how to customize syntax highlighting of source code using themes. It walks the user through the basics of syntax highlighting in \textbf{knitr}, and the use of built-in themes. \end{abstract} The \textbf{knitr} package uses the \textbf{highr} package to highlight source code in a document. In short, the \textbf{highr} package parses the source code, tokenizes it into grammar symbols, and formats their appearance using CSS or \LaTeX{} commands. \section{Usage} We can use the object \texttt{knit\_theme} to set / get a theme. See \texttt{?knit\_theme} for the usage. For example, we set the theme of this document to be \texttt{solarized-dark}: <>= @ \section{Built-in Themes} \begin{margintable} <>= cat(c(readLines('../themes/edit-eclipse.css', n=30),'...'),sep='\n') @ \end{margintable} The listing on the right shows the CSS file for one of the themes, \texttt{edit-eclipse}, which was adapted from Andre Simon's excellent highlighter\footnote{\url{http://www.andre-simon.de/}}. The \textbf{knitr} package comes pre-loaded with a number of themes based on this highlighter. Here is list of all available code themes\footnote{For a preview of all themes, see \url{https://gist.github.com/yihui/3422133}}: <>= knit_theme$get() @ Shown below is how the \texttt{solarized-dark} theme looks like when applied to R code: <>= library(XML) library(plyr) library(reshape) # SCRAPE THE DATA FROM WEB base_url = "http://www.mlsoccer.com/stats/%s/reg" years = 1996:2010 options(width = 40) #' Function to save data for each year save_data = function(y){ url = sprintf(base_url, y) tab = readHTMLTable(url, header = FALSE, stringsAsFactors = FALSE); pos = max(grep("United", tab)); tab = tab[[pos]]; tab$year = y; return(tab) } team.list = llply(years, save_data); mls = merge_recurse(team.list); @ \section{Misc} One thing to consider is the foreground color of plots when we use dark themes; we need to make it lighter, otherwise the graphical elements will be difficult to be read. We can access the foreground color of the theme in the list returned by \texttt{knit\_theme\$get(theme)}, e.g., for this document: <>= ## the object thm is from the first chunk thm$foreground # foreground color thm$background # background color @ When we make plots, we may use these colors, e.g. <>= ## can design a chunk hook to set foreground color automatically fgcolor=thm$foreground par(fg=fgcolor, col.axis=fgcolor, col.lab=fgcolor) plot(rnorm(100),pch=19) @ Of course, we do not need to worry about these colors when we use a white background for the plots. \end{document} knitr/inst/examples/knitr-listings.lyx0000644000175100001440000002013013142522202017716 0ustar hornikusers#LyX 2.0 created this file. For more info see http://www.lyx.org/ \lyxformat 413 \begin_document \begin_header \textclass article \use_default_options true \begin_modules knitr \end_modules \maintain_unincluded_children false \language english \language_package none \inputencoding default \fontencoding global \font_roman palatino \font_sans default \font_typewriter default \font_default_family default \use_non_tex_fonts false \font_sc true \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref true \pdf_bookmarks true \pdf_bookmarksnumbered true \pdf_bookmarksopen true \pdf_bookmarksopenlevel 2 \pdf_breaklinks false \pdf_pdfborder false \pdf_colorlinks false \pdf_backref false \pdf_pdfusetitle true \pdf_quoted_options "pdfstartview={XYZ null null 1}" \papersize default \use_geometry true \use_amsmath 1 \use_esint 1 \use_mhchem 1 \use_mathdots 1 \cite_engine basic \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \use_refstyle 1 \index Index \shortcut idx \color #008000 \end_index \leftmargin 2.5cm \topmargin 2.5cm \rightmargin 2.5cm \bottommargin 2.5cm \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \listings_params "language=R" \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(knitr) \end_layout \begin_layout Plain Layout opts_chunk$set(fig.path = 'figure/listings-') \end_layout \begin_layout Plain Layout options(formatR.arrow = TRUE) \end_layout \begin_layout Plain Layout render_listings() \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Title Using listings with knitr \end_layout \begin_layout Author Yihui Xie \end_layout \begin_layout Standard To use the \series bold listings \series default package with \series bold knitr \series default , all you need to do is to call a function in your first setup chunk (that chunk should be hidden from the output with \family typewriter include=FALSE \family default and should not be cached): \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout % I just want to echo the 2nd line \end_layout \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard This function modifies the output hooks and header information so that the output is written in \series bold listings \series default environments, which are kindly provided by Frank Harrell and can be found in \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://github.com/yihui/knitr/blob/master/inst/misc/Sweavel.sty \end_layout \end_inset . Of course you have to install the \series bold listings \series default package if your LaTeX toolset does not include this package. \end_layout \begin_layout Standard Now we can see how the results look like with our new settings: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout set.seed(1121) # for reproducibility \end_layout \begin_layout Plain Layout options(width=85) \end_layout \begin_layout Plain Layout x=rnorm(20) \end_layout \begin_layout Plain Layout x \end_layout \begin_layout Plain Layout mean(x) \end_layout \begin_layout Plain Layout sqrt(-1) # this will give you a warning message \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Another chunk: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout hook_rgl = function(before, options, envir) { \end_layout \begin_layout Plain Layout ## after a chunk has been evaluated \end_layout \begin_layout Plain Layout if (before || !require('rgl') || rgl.cur() == 0) return() # no active device \end_layout \begin_layout Plain Layout name = paste(valid_prefix(options$fig.path), options$label, sep = '') \end_layout \begin_layout Plain Layout par3d(windowRect = 100 + options$dpi * c(0, 0, options$width, options$height )) \end_layout \begin_layout Plain Layout Sys.sleep(.05) # need time to respond to window size change \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout fmt = opts_knit$get('out.format') \end_layout \begin_layout Plain Layout if (fmt %in% c('html', 'markdown', 'gfm', 'jekyll')) options$dev = 'png' \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout ## support 3 formats: eps, pdf and png (default) \end_layout \begin_layout Plain Layout switch(options$dev, \end_layout \begin_layout Plain Layout postscript = rgl.postscript(paste(name, '.eps', sep = ''), fmt = 'eps'), \end_layout \begin_layout Plain Layout pdf = rgl.postscript(paste(name, '.pdf', sep = ''), fmt = 'pdf'), \end_layout \begin_layout Plain Layout rgl.snapshot(paste(name, '.png', sep = ''), fmt = 'png')) \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout if (fmt == 'html') return(.plot.hook.html(c(name, 'png'), options)) \end_layout \begin_layout Plain Layout if (fmt %in% c('markdown', 'gfm', 'jekyll')) \end_layout \begin_layout Plain Layout return(.plot.hook.markdown(c(name, 'png'), options)) \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout paste(ifelse(options$align == 'center', ' \backslash \backslash centering{}', ''), ' \backslash \backslash includegraphics[', \end_layout \begin_layout Plain Layout sprintf('width=%s', options$out.width), ']{', name, '} \backslash n', sep = '') \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Well, we can do crazier things with \series bold knitr \series default . Here we use the \family typewriter fig.cap \family default option to write plots into the \family typewriter figure \family default environment automatically, and the caption is generated from data dynamically (see Figure \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash ref{fig:boxplot-ex} \end_layout \end_inset ): \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout % set an option first \end_layout \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout opts_knit$set(eval.after = 'fig.cap') # evaluate fig.cap after the chunk \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout par(mar=c(4,4,.1,.1)) \end_layout \begin_layout Plain Layout boxplot(x, horizontal=TRUE) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard As we know, \family typewriter figure \family default is a float environment, so it has floated away from the R code to the top of this page. This should not be surprising to LaTeX users. \end_layout \begin_layout Standard You should be able to compile the TeX document and get a PDF file like this one: \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://github.com/yihui/knitr/releases/download/doc/knitr-listings.pdf \end_layout \end_inset . For more information about out hooks, see \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://yihui.name/knitr/hooks \end_layout \end_inset . \end_layout \end_body \end_document knitr/inst/examples/child/0000755000175100001440000000000013142526155015301 5ustar hornikusersknitr/inst/examples/child/sub/0000755000175100001440000000000012304672772016100 5ustar hornikusersknitr/inst/examples/child/sub/knitr-child-c.Rnw0000644000175100001440000000010013142522202021166 0ustar hornikusers\section{Child in a sub directory} <>= 1+1 # child d @ knitr/inst/examples/child/knitr-main.Rnw0000644000175100001440000000041113142522202020023 0ustar hornikusers\documentclass{article} \usepackage{mathpazo} \begin{document} This main document has several children. <>= 1+1 @ <>= @ <>= @ \end{document} knitr/inst/examples/child/knitr-child-a.Rnw0000644000175100001440000000020613142522202020402 0ustar hornikusers\section{Child via the \texttt{child} option} This chunk below is from the chunk option \texttt{child}. <>= 1+1 # child a @ knitr/inst/examples/child/knitr-main.Rmd0000644000175100001440000000033113142522202020000 0ustar hornikusersYou can also use the `child` option to include child documents in markdown. ```{r test-main, child='knitr-child.Rmd'} ``` You can continue your main document below, of course. ```{r test-another} pmax(1:10, 5) ``` knitr/inst/examples/child/knitr-child-b.Rnw0000644000175100001440000000012313142522202020401 0ustar hornikusers\section{Another child via the \texttt{child} option} <>= 1+1 # child b @ knitr/inst/examples/child/knitr-child.Rmd0000644000175100001440000000012013142522202020133 0ustar hornikusersHi, there. I'm a child. ```{r test-child} options(digits = 4) 1+1 dnorm(0) ``` knitr/inst/examples/child/knitr-parent.Rnw0000644000175100001440000000041613142522202020375 0ustar hornikusers\section{Child can specify its parents} <>= set_parent('knitr-main.Rnw') @ My parent is \textsf{knitr-main.Rnw}. <>= 1+1 @ I'm not a complete LaTeX document, but you can compile me nonetheless. I'll borrow the preamble from my parent. knitr/inst/examples/knitr-themes.lyx0000644000175100001440000002246713142522202017366 0ustar hornikusers#LyX 2.1 created this file. For more info see http://www.lyx.org/ \lyxformat 474 \begin_document \begin_header \textclass tufte-handout \begin_preamble \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \usepackage[breaklinks=true,pdfstartview=FitH]{hyperref} \end_preamble \options justified \use_default_options true \begin_modules knitr \end_modules \maintain_unincluded_children false \language english \language_package none \inputencoding default \fontencoding global \font_roman default \font_sans default \font_typewriter default \font_math auto \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 88 \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref false \pdf_author "Ramnath Vaidyanathan" \pdf_bookmarks true \pdf_bookmarksnumbered true \pdf_bookmarksopen true \pdf_bookmarksopenlevel 1 \pdf_breaklinks false \pdf_pdfborder true \pdf_colorlinks true \pdf_backref false \pdf_pdfusetitle true \pdf_quoted_options "citecolor = blue, linkcolor = magenta, urlcolor = green" \papersize default \use_geometry true \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 1 \use_package mathtools 1 \use_package mhchem 1 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine basic \cite_engine_type default \biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 0 \index Index \shortcut idx \color #008000 \end_index \leftmargin 1in \topmargin 1in \rightmargin 1in \bottommargin 1in \secnumdepth 2 \tocdepth 2 \paragraph_separation indent \paragraph_indentation default \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(knitr) \end_layout \begin_layout Plain Layout opts_chunk$set(fig.path='figure/theme-', cache.path='cache/theme-', cache=TRUE) \end_layout \begin_layout Plain Layout options(formatR.arrow=TRUE,width=78) \end_layout \begin_layout Plain Layout knit_hooks$set(par=function(before, options, envir){if (before) par(mar=c(4,4,.1,. 1),cex.lab=.95,cex.axis=.9,mgp=c(2,.7,0),tcl=-.3)}) \end_layout \begin_layout Plain Layout @ \end_layout \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout thm = knit_theme$get("solarized-dark") \end_layout \begin_layout Plain Layout knit_theme$set(thm) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Title Customizing Syntax Highlighting Themes \end_layout \begin_layout Author Yihui Xie & Ramnath Vaidyanathan \end_layout \begin_layout Abstract This manual \begin_inset Foot status open \begin_layout Plain Layout source code at \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://github.com/yihui/knitr/blob/master/inst/examples/knitr-themes.Rnw \end_layout \end_inset \end_layout \end_inset shows how to customize syntax highlighting of source code using themes. It walks the user through the basics of syntax highlighting in \series bold knitr \series default , and the use of built-in themes. \end_layout \begin_layout Standard The \series bold knitr \series default package uses the \series bold highr \series default package to highlight source code in a document. In short, the \series bold highr \series default package parses the source code, tokenizes it into grammar symbols, and formats their appearance using CSS or LaTeX commands. \end_layout \begin_layout Section Usage \end_layout \begin_layout Standard We can use the object \family typewriter knit_theme \family default to set / get a theme. See \family typewriter ?knit_theme \family default for the usage. For example, we set the theme of this document to be \family typewriter solarized-dark \family default : \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Section Built-in Themes \end_layout \begin_layout Standard \begin_inset Float margintable wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout cat(c(readLines('../themes/edit-eclipse.css', n=30),'...'),sep=' \backslash n') \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard The listing on the right shows the CSS file for one of the themes, \family typewriter edit-eclipse \family default , which was adapted from Andre Simon's excellent highlighter \begin_inset Foot status open \begin_layout Plain Layout \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://www.andre-simon.de/ \end_layout \end_inset \end_layout \end_inset . The \series bold knitr \series default package comes pre-loaded with a number of themes based on this highlighter. Here is list of all available code themes \begin_inset Foot status open \begin_layout Plain Layout For a preview of all themes, see \begin_inset Flex URL status collapsed \begin_layout Plain Layout https://gist.github.com/yihui/3422133 \end_layout \end_inset \end_layout \end_inset : \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout knit_theme$get() \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Shown below is how the \family typewriter solarized-dark \family default theme looks like when applied to R code: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout library(XML) \end_layout \begin_layout Plain Layout library(plyr) \end_layout \begin_layout Plain Layout library(reshape) \end_layout \begin_layout Plain Layout # SCRAPE THE DATA FROM WEB \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout base_url = "http://www.mlsoccer.com/stats/%s/reg" \end_layout \begin_layout Plain Layout years = 1996:2010 \end_layout \begin_layout Plain Layout options(width = 40) \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout #' Function to save data for each year \end_layout \begin_layout Plain Layout save_data = function(y){ \end_layout \begin_layout Plain Layout url = sprintf(base_url, y) \end_layout \begin_layout Plain Layout tab = readHTMLTable(url, header = FALSE, stringsAsFactors = FALSE); \end_layout \begin_layout Plain Layout pos = max(grep("United", tab)); \end_layout \begin_layout Plain Layout tab = tab[[pos]]; \end_layout \begin_layout Plain Layout tab$year = y; \end_layout \begin_layout Plain Layout return(tab) \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout team.list = llply(years, save_data); \end_layout \begin_layout Plain Layout mls = merge_recurse(team.list); \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Section Misc \end_layout \begin_layout Standard One thing to consider is the foreground color of plots when we use dark themes; we need to make it lighter, otherwise the graphical elements will be difficult to be read. We can access the foreground color of the theme in the list returned by \family typewriter knit_theme$get(theme) \family default , e.g., for this document: \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout ## the object thm is from the first chunk \end_layout \begin_layout Plain Layout thm$foreground # foreground color \end_layout \begin_layout Plain Layout thm$background # background color \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard When we make plots, we may use these colors, e.g. \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout <>= \end_layout \begin_layout Plain Layout ## can design a chunk hook to set foreground color automatically \end_layout \begin_layout Plain Layout fgcolor=thm$foreground \end_layout \begin_layout Plain Layout par(fg=fgcolor, col.axis=fgcolor, col.lab=fgcolor) \end_layout \begin_layout Plain Layout plot(rnorm(100),pch=19) \end_layout \begin_layout Plain Layout @ \end_layout \end_inset \end_layout \begin_layout Standard Of course, we do not need to worry about these colors when we use a white background for the plots. \end_layout \end_body \end_document knitr/inst/examples/knitr-listings.Rnw0000644000175100001440000000752713142522202017667 0ustar hornikusers%% LyX 2.2.1 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass{article} \usepackage[sc]{mathpazo} \usepackage[T1]{fontenc} \usepackage{geometry} \geometry{verbose,tmargin=2.5cm,bmargin=2.5cm,lmargin=2.5cm,rmargin=2.5cm} \usepackage{url} \usepackage[unicode=true,pdfusetitle, bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2, breaklinks=false,pdfborder={0 0 1},backref=false,colorlinks=false] {hyperref} \hypersetup{ pdfstartview={XYZ null null 1}} \usepackage{breakurl} \usepackage{listings} \lstset{language=R} \begin{document} <>= library(knitr) opts_chunk$set(fig.path = 'figure/listings-') options(formatR.arrow = TRUE) render_listings() @ \title{Using listings with knitr} \author{Yihui Xie} \maketitle To use the \textbf{listings} package with \textbf{knitr}, all you need to do is to call a function in your first setup chunk (that chunk should be hidden from the output with \texttt{include=FALSE} and should not be cached): % I just want to echo the 2nd line <>= @ This function modifies the output hooks and header information so that the output is written in \textbf{listings} environments, which are kindly provided by Frank Harrell and can be found in \url{https://github.com/yihui/knitr/blob/master/inst/misc/Sweavel.sty}. Of course you have to install the \textbf{listings} package if your \LaTeX{} toolset does not include this package. Now we can see how the results look like with our new settings: <>= set.seed(1121) # for reproducibility options(width=85) x=rnorm(20) x mean(x) sqrt(-1) # this will give you a warning message @ Another chunk: <>= hook_rgl = function(before, options, envir) { ## after a chunk has been evaluated if (before || !require('rgl') || rgl.cur() == 0) return() # no active device name = paste(valid_prefix(options$fig.path), options$label, sep = '') par3d(windowRect = 100 + options$dpi * c(0, 0, options$width, options$height)) Sys.sleep(.05) # need time to respond to window size change fmt = opts_knit$get('out.format') if (fmt %in% c('html', 'markdown', 'gfm', 'jekyll')) options$dev = 'png' ## support 3 formats: eps, pdf and png (default) switch(options$dev, postscript = rgl.postscript(paste(name, '.eps', sep = ''), fmt = 'eps'), pdf = rgl.postscript(paste(name, '.pdf', sep = ''), fmt = 'pdf'), rgl.snapshot(paste(name, '.png', sep = ''), fmt = 'png')) if (fmt == 'html') return(.plot.hook.html(c(name, 'png'), options)) if (fmt %in% c('markdown', 'gfm', 'jekyll')) return(.plot.hook.markdown(c(name, 'png'), options)) paste(ifelse(options$align == 'center', '\\centering{}', ''), '\\includegraphics[', sprintf('width=%s', options$out.width), ']{', name, '}\n', sep = '') } @ Well, we can do crazier things with \textbf{knitr}. Here we use the \texttt{fig.cap} option to write plots into the \texttt{figure} environment automatically, and the caption is generated from data dynamically (see Figure \ref{fig:boxplot-ex}): % set an option first <>= opts_knit$set(eval.after = 'fig.cap') # evaluate fig.cap after the chunk <>= par(mar=c(4,4,.1,.1)) boxplot(x, horizontal=TRUE) @ As we know, \texttt{figure} is a float environment, so it has floated away from the R code to the top of this page. This should not be surprising to \LaTeX{} users. You should be able to compile the \TeX{} document and get a PDF file like this one: \url{https://github.com/yihui/knitr/releases/download/doc/knitr-listings.pdf}. For more information about out hooks, see \url{https://yihui.name/knitr/hooks}. \end{document} knitr/inst/examples/knitr-spin.html0000644000175100001440000006706613010461670017213 0ustar hornikusers

This is a special R script which can be used to generate a report. You can write normal text in roxygen comments.

First we set up some options (you do not have to do this):

The report begins here.

# boring examples as usual
set.seed(123)
x = rnorm(5)
mean(x)
## [1] 0.1935703

You can use the special syntax {{code}} to embed inline expressions, e.g. 2.1935703 is the mean of x plus 2. The code itself may contain braces, but these are not checked. Thus, perfectly valid (though very strange) R code such as {{2 + 3}} - {{4 - 5}} can lead to errors because 2 + 3}} - {{4 - 5 will be treated as inline code.

Now we continue writing the report. We can draw plots as well.

par(mar = c(4, 4, 0.1, 0.1))
plot(x)

plot of chunk test-b

Actually you do not have to write chunk options, in which case knitr will use default options. For example, the code below has no options attached:

var(x)
## [1] 0.6577564
quantile(x)
##          0%         25%         50%         75%        100% 
## -0.56047565 -0.23017749  0.07050839  0.12928774  1.55870831

And you can also write two chunks successively like this:

sum(x^2)  # chi-square distribution with df 5
## [1] 2.818373
sum((x - mean(x))^2)  # df is 4 now
## [1] 2.631026

Done. Call spin('knitr-spin.R') to make silk from sow's ear now and knit a lovely purse.

knitr/inst/examples/knitr-manual.Rnw0000644000175100001440000010272613142522202017305 0ustar hornikusers%% LyX 2.2.1 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass{article} \usepackage[sc]{mathpazo} \renewcommand{\sfdefault}{lmss} \renewcommand{\ttdefault}{lmtt} \usepackage[T1]{fontenc} \usepackage{geometry} \geometry{verbose,tmargin=2.5cm,bmargin=2.5cm,lmargin=2.5cm,rmargin=2.5cm} \setcounter{secnumdepth}{2} \setcounter{tocdepth}{2} \usepackage{url} \usepackage[authoryear]{natbib} \usepackage[unicode=true,pdfusetitle, bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2, breaklinks=false,pdfborder={0 0 1},backref=false,colorlinks=false] {hyperref} \hypersetup{ pdfstartview={XYZ null null 1}} \usepackage{breakurl} \makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands. \providecommand{\LyX}{\texorpdfstring% {L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX\@} {LyX}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \usepackage[buttonsize=1em]{animate} \makeatother \begin{document} <>= library(knitr) ## set global chunk options opts_chunk$set(fig.path='figure/manual-', cache.path='cache/manual-', fig.align='center', fig.show='hold', par=TRUE) ## I use = but I can replace it with <-; set code/output width to be 68 options(formatR.arrow=TRUE, width=68, digits=4) ## tune details of base graphics (https://yihui.name/knitr/hooks) knit_hooks$set(par=function(before, options, envir){ if (before && options$fig.show!='none') par(mar=c(4,4,.1,.1),cex.lab=.95,cex.axis=.9,mgp=c(2,.7,0),tcl=-.3) }) @ \title{knitr: A General-Purpose Tool for Dynamic Report Generation in R} \author{Yihui Xie} \maketitle The original paradigm of literate programming was brought forward mainly for software development, or specifically, to mix source code (for computer) and documentation (for human) together. Early systems include \href{http://www.literateprogramming.com/web.pdf}{WEB} and \href{http://www.cs.tufts.edu/~nr/noweb/}{Noweb}; Sweave \citep{leisch2002} was derived from the latter, but it is less focused on documenting software, instead it is mainly used for reproducible data analysis and generating statistical reports. The \textbf{knitr} package \citep{R-knitr} is following the steps of Sweave. For this manual, I assume readers have some background knowledge of Sweave to understand the technical details; for a reference of available options, hooks and demos, see the package homepage \url{https://yihui.name/knitr/}. \section{Hello World} A natural question is why to reinvent the wheel. The short answer is that extending Sweave by hacking \textsf{SweaveDrivers.R} in the \textbf{utils} package is a difficult job to me. Many features in \textbf{knitr} come naturally as users would have expected. Figure \ref{fig:cars-demo} is a simple demo of some features of \textbf{knitr}. \begin{figure} <>= fit=lm(dist~speed,data=cars) # linear regression par(mar=c(4, 4, 1, .1), mgp=c(2,1,0)) with(cars,plot(speed,dist,panel.last=abline(fit))) text(10,100,'$Y = \\beta_0 + \\beta_1x + \\epsilon$') library(ggplot2) qplot(speed, dist, data=cars)+geom_smooth() @ \caption{\label{fig:cars-demo}A simple demo of possible output in \textbf{knitr}: (1) multiple plots per chunk; (2) no need to \emph{print()} objects in \textbf{ggplot2}; (3) device size is $4\times2.8$ (inches) but output size is adjusted to \texttt{.45\textbackslash{}textwidth} in chunk options; (4) base graphics and \textbf{ggplot2} can sit side by side; (5) use the \emph{tikz()} device in \textbf{tikzDevice} by setting chunk option \texttt{dev='tikz'} (hence can write native \protect\LaTeX{} expressions in R plots); (6) code highlighting.} \end{figure} I would have chosen to hide the R code if this were a real report, but here I show the code just for the sake of demonstration. If we type \emph{qplot()} in R, we get a plot, and the same thing happens in \textbf{knitr}. If we draw two plots in the code, \textbf{knitr} will show two plots and we do not need to tell it how many plots are there in the code in advance. If we set \texttt{out.width='.49\textbackslash{}\textbackslash{}textwidth'} in chunk options, we get it in the final output document. If we say \texttt{fig.align='center'}, the plots are centered. That's it. Many enhancements and new features will be introduced later. If you come from the Sweave land, you can take a look at the page of transition first: \url{https://yihui.name/knitr/demo/sweave/}. \section{Design} The flow of processing an input file is similar to Sweave, and two major differences are that \textbf{knitr} provides more flexibility to the users to customize the processing, and has many built-in options such as the support to a wide range of graphics devices and cache. Below is a brief description of the process: \begin{enumerate} \item \textbf{knitr} takes an input file and automatically determines an appropriate set of \href{https://yihui.name/knitr/patterns}{patterns} to use if they are not provided in advance (e.g. \textsf{file.Rnw} will use \texttt{knit\_patterns\$get('rnw')}); \item a set of output \href{https://yihui.name/knitr/hooks}{hooks} will also be set up automatically according to the filename extension (e.g. use \LaTeX{} environments or HTML elements to wrap up R results); \item the input file is read in and split into pieces consisting of R code chunks and normal texts; the former will be executed one after the other, and the latter may contain global chunk options or inline R code; \item for each chunk, the code is evaluated using the \textbf{evaluate} package \citep{R-evaluate}, and the results may be filtered according to chunk options (e.g. \texttt{echo=FALSE} will remove the R source code) \begin{enumerate} \item if \texttt{cache=TRUE} for this chunk, \textbf{knitr} will first check if there are previously cached results under the cache directory before really evaluating the chunk; if cached results exist and this code chunk has not been changed since last run (use MD5 sum to verify), the cached results will be (lazy-) loaded, otherwise new cache will be built; if a cached chunk depends on other chunks (see the \texttt{dependson} \href{https://yihui.name/knitr/options}{option}) and any one of these chunks has changed, this chunk must be forcibly updated (old cache will be purged) \item there are six types of possible output from \textbf{evaluate}, and their classes are \texttt{character} (normal text output), \texttt{source} (source code), \texttt{warning}, \texttt{message}, \texttt{error} and \texttt{recordedplot}; an internal S3 generic function \emph{wrap()} is used to deal with different types of output, using output hooks defined in the object \texttt{knit\_hooks} \item note plots are recorded as R objects before they are really saved to files, so graphics devices will not be opened unless plots have really been produced in a chunk \item a code chunk is evaluated in a separate empty environment with the global environment as its parent, and all the objects in this environment after the evaluation will be saved if \texttt{cache=TRUE} \item chunk hooks can be run before and/or after a chunk \end{enumerate} \item for normal texts, \textbf{knitr} will find inline R code (e.g. in \texttt{\textbackslash{}Sexpr\{\}}) and evaluate it; the output is wrapped by the \texttt{inline} hook; \end{enumerate} The hooks play important roles in \textbf{knitr}: this package makes almost everything accessible to the users. Consider the following extremely simple example which may demonstrate this freedom: <>= 1+1 @ There are two parts in the final output: the source code \texttt{1 + 1} and the output \texttt{{[}1{]} 2}; the comment characters \texttt{\#\#} are from the default chunk option \texttt{comment}. Users may define a hook function for the source code like this to use the \texttt{lstlisting} environment: <>= knit_hooks$set(source = function(x, options) { paste('\\begin{lstlisting}\n', x, '\\end{lstlisting}\n', sep = '') }) @ Similarly we can put other types of output into other environments. There is no need to hack at \textsf{Sweave.sty} for \textbf{knitr} and you can put the output in any environments. What is more, the output hooks make \textbf{knitr} ready for other types of output, and a typical one is HTML (there are built-in hooks). The website has provided many examples demonstrating the flexibility of the output. \section{Features} The \textbf{knitr} package borrowed features such as tikz graphics and cache from \textbf{pgfSweave} and \textbf{cacheSweave} respectively, but the implementations are different. New features like code reference from an external R script as well as output customization are also introduced. The feature of hook functions in Sweave is re-implemented and hooks have new usage now. There are several other small features which are motivated from my everyday use of Sweave. For example, a progress bar is provided when knitting a file so we roughly know how long we still need to wait; output from inline R code (e.g. \texttt{\textbackslash{}Sexpr\{x{[}1{]}\}}) is automatically formatted in \TeX{} math notation (like \Sexpr{123456789}) if the result is numeric. You may check out a number of specific manuals dedicated to specific features such as graphics in the website: \url{https://yihui.name/knitr/demos}. \subsection{Code Decoration} The \textbf{highr} package \citep{R-highr} is used to highlight R code, and the \textbf{formatR} package \citep{R-formatR} is used to reformat R code (like \texttt{keep.source=FALSE} in Sweave but will also try to retain comments). For \LaTeX{} output, the \textbf{framed} package is used to decorate code chunks with a light gray background. If this \LaTeX{} package is not found in the system, a version will be copied directly from \textbf{knitr}. The prompt characters are removed by default because they mangle the R source code in the output and make it difficult to copy R code. The R output is masked in comments by default based on the same rationale. It is easy to revert to the output with prompts (set option \texttt{prompt=TRUE}), and you will quickly realize the inconvenience to the readers if they want to copy and run the code in the output document: <>= x=rnorm(5) x var(x) @ The example below shows the effect of \texttt{tidy=TRUE/FALSE}: <>= ## option tidy=FALSE for(k in 1:10){j=cos(sin(k)*k^2)+3;print(j-5)} @ <>= ## option tidy=TRUE for(k in 1:10){j=cos(sin(k)*k^2)+3;print(j-5)} @ Note \texttt{=} is replaced by \texttt{<-} because \texttt{options('formatR.arrow')} was set to be \texttt{TRUE} in this document; see the documentation of \emph{tidy.source()} in \textbf{formatR} for details. Many highlighting themes can be used in \textbf{knitr}, which are borrowed from the \textbf{highlight} package by \href{http://www.andre-simon.de/}{Andre Simon}\footnote{not the R package mentioned before; for a preview of these themes, see \url{http://www.andre-simon.de/dokuwiki/doku.php?id=theme_examples}}; it is also possible to use themes from \url{http://www.eclipsecolorthemes.org/} by providing a theme id to \textbf{knitr}\footnote{many thanks to \href{https://github.com/ramnathv}{Ramnath Vaidyanathan} for the work on themes}. See \texttt{?knit\_theme} for details. \subsection{Graphics} Graphics is an important part of reports, and several enhancements have been made in \textbf{knitr}. For example, grid graphics may not need to be explicitly printed as long as the same code can produce plots in R (in some cases, however, they have to be printed, e.g. in a loop, because you have to do so in an R terminal). \subsubsection{Graphical Devices} Over a long time, a frequently requested feature for Sweave was the support for other graphics devices, which has been implemented since R 2.13.0. Instead of using logical options like \texttt{png} or \texttt{jpeg} (this list can go on and on), \textbf{knitr} uses a single option \texttt{dev} (like \texttt{grdevice} in Sweave) which has support for more than 20 devices. For instance, \texttt{dev='png'} will use the \emph{png()} device, and \texttt{dev='CairoJPEG'} uses the \emph{CairoJPEG()} device in the \textbf{Cairo} package (it has to be installed first, of course). If none of these devices is satisfactory, you can provide the name of a customized device function, which must have been defined before it is called. \subsubsection{Plot Recording} As mentioned before, all the plots in a code chunk are first recorded as R objects and then ``replayed'' inside a graphical device to generate plot files. The \textbf{evaluate} package will record plots per \emph{expression} basis, in other words, the source code is split into individual complete expressions and \textbf{evaluate} will examine possible plot changes in snapshots after each single expression has been evaluated. For example, the code below consists of three expressions, out of which two are related to drawing plots, therefore \textbf{evaluate} will produce two plots by default: <>= par(mar=c(3,3,.1,.1)) plot(1:10, ann=FALSE,las=1) text(5,9,'mass $\\rightarrow$ energy\n$E=mc^2$') @ This brings a significant difference with traditional tools in R for dynamic report generation, since low-level plotting changes can also be recorded. The option \texttt{fig.keep} controls which plots to keep in the output; \texttt{fig.keep='all'} will keep low-level changes as separate plots; by default (\texttt{fig.keep='high'}), \textbf{knitr} will merge low-level plot changes into the previous high-level plot, like most graphics devices do. This feature may be useful for teaching R graphics step by step. Note, however, low-level plotting commands in a single expression (a typical case is a loop) will not be recorded accumulatively, but high-level plotting commands, regardless of where they are, will always be recorded. For example, this chunk will only produce 2 plots instead of 21 plots because there are 2 complete expressions: <>= plot(0,0,type='n',ann=FALSE) for(i in seq(0, 2*pi,length=20)) points(cos(i),sin(i)) @ But this will produce 20 plots as expected: <>= for(i in seq(0, 2*pi,length=20)) {plot(cos(i),sin(i),xlim=c(-1,1),ylim=c(-1,1))} @ As I showed in the beginning of this manual, it is straightforward to let \textbf{knitr} keep all the plots in a chunk and insert them into the output document, so we no longer need the \texttt{cat('\textbackslash{}\textbackslash{}includegraphics\{\}')} trick. We can discard all previous plots and keep the last one only by \texttt{fig.keep='last'}, or keep only the first plot by \texttt{fig.keep='first'}, or discard all plots by \texttt{fig.keep='none'}. \subsubsection{Plot Rearrangement} The option \texttt{fig.show} can decide whether to hold all plots while evaluating the code and ``flush'' all of them to the end of a chunk (\texttt{fig.show='hold'}), or just insert them to the place where they were created (by default \texttt{fig.show='asis'}). Here is an example of \texttt{fig.show='asis'}: <>= contour(volcano) # contour lines filled.contour(volcano) # fill contour plot with colors @ Beside \texttt{hold} and \texttt{asis}, the option \texttt{fig.show} can take a third value: \texttt{animate}, which makes it possible to insert animations into the output document. In \LaTeX{}, the package \textbf{animate} is used to put together image frames as an animation. For animations to work, there must be more than one plot produced in a chunk. The option \texttt{interval} controls the time interval between animation frames; by default it is 1 second. Note you have to add \texttt{\textbackslash{}usepackage\{animate\}} in the \LaTeX{} preamble, because \textbf{knitr} will not add it automatically. Animations in the PDF output can only be viewed in Adobe Reader. As a simple demonstration, here is a \href{http://en.wikipedia.org/wiki/Mandelbrot_set}{Mandelbrot animation} taken from the \textbf{animation} package \citep{R-animation}; note the PNG device is used because PDF files are too large. You should be able to see the animation immediately with Acrobat Reader since it was set to play automatically: <>= library(animation) demo('Mandelbrot', echo = FALSE, package = 'animation') @ \subsubsection{Plot Size} The \texttt{fig.width} and \texttt{fig.height} options specify the size of plots in the graphics device, and the real size in the output document can be different (see \texttt{out.width} and \texttt{out.height}). When there are multiple plots per chunk, it is possible to arrange more than one plot per line in \LaTeX{} \textendash{} just specify \texttt{out.width} to be less than half of the current line width, e.g. \texttt{out.width='.49\textbackslash{}\textbackslash{}linewidth'}. \subsubsection{The tikz Device} Beside PDF, PNG and other traditional R graphical devices, \textbf{knitr} has special support to tikz graphics via the \textbf{tikzDevice} package \citep{R-tikzDevice}, which is similar to \textbf{pgfSweave}. If we set the chunk option \texttt{dev='tikz'}, the \emph{tikz()} device in \textbf{tikzDevice} will be used to save plots. Options \texttt{sanitize} and \texttt{external} are related to the tikz device: see the documentation of \emph{tikz()} for details. Note \texttt{external=TRUE} in \textbf{knitr} has a different meaning with \textbf{pgfSweave} \textendash{} it means \texttt{standAlone=TRUE} in \emph{tikz()}, and the tikz graphics output will be compiled to PDF \emph{immediately} after it is created, so the ``externalization'' does not depend on the \textbf{tikz} package; to maintain consistency in (font) styles, \textbf{knitr} will read the preamble of the input document and use it in the tikz device. At the moment, I'm not sure if this is a faithful way to externalize tikz graphics, but I have not seen any problems so far. The assumption to make, however, is that you declare all the styles in the preamble; \textbf{knitr} is agnostic of \emph{local} style changes in the body of the document. Below is an example taken from StackOverflow\footnote{\url{http://stackoverflow.com/q/8190087/559676}}; we usually have to write R code like this to obtain a math expression $\mathrm{d}\mathbf{x}_{t}=\alpha[(\theta-\mathbf{x}_{t})\mathrm{d}t+4]\mathrm{d}B_{t}$ in R graphics: <>= qplot(1:10, 1:10) + opts(title = substitute(paste(d * bolditalic(x)[italic(t)] == alpha * (theta - bolditalic(x)[italic(t)]) * d * italic(t) + lambda * d * italic(B)[italic(t)]), list(lambda = 4))) @ With the tikz device, it is both straightforward and more beautiful: <>= library(ggplot2) qplot(1:10, 1:10) + labs(title = sprintf('$\\mathrm{d}\\mathbf{x}_{t} = \\alpha[(\\theta - \\mathbf{x}_{t})\\mathrm{d}t + %d]\\mathrm{d}B_{t}$', 4)) @ The advantage of tikz graphics is the consistency of styles\footnote{Users are encouraged to read the vignette of \textbf{tikzDevice}, which is the most beautiful vignette I have ever seen in R packages: \url{http://cran.r-project.org/web/packages/tikzDevice/vignettes/tikzDevice.pdf}}, and one disadvantage is that \LaTeX{} may not be able to handle too large tikz files (it can run out of memory). For example, an R plot with tens of thousands of graphical elements may fail to compile in \LaTeX{} if we use the tikz device. In such cases, we can switch to the PDF or PNG device, or reconsider our decision on the type of plots, e.g., a scatter plot with millions of points is usually difficult to read, and a contour plot or a hexagon plot showing the 2D density can be a better alternative (they are smaller in size). The graphics manual contains more detailed information and you can check it out in the \href{https://yihui.name/knitr/demo/graphics/}{website}. \subsection{Cache} The feature of cache is not a new idea \textendash{} both \textbf{cacheSweave} and \textbf{weaver} have implemented it based on Sweave, with the former using \textbf{filehash} and the latter using \textsf{.RData} images; \textbf{cacheSweave} also supports lazy-loading of objects based on \textbf{filehash}. The \textbf{knitr} package directly uses internal base R functions to save (\emph{tools:::makeLazyLoadDB()}) and lazy-load objects (\emph{lazyLoad()}). These functions are either undocumented or marked as internal, but as far as I understand, they are the tools to implement lazy-loading for packages. The \textbf{cacheSweave} vignette has clearly explained lazy-loading, and roughly speaking, lazy-loading means an object will not be really loaded into memory unless it is really used somewhere. This is very useful for cache; sometimes we read a large object and cache it, then take a subset for analysis and this subset is also cached; in the future, the initial large object will not be loaded into R if our computation is only based on the object of its subset. The paths of cache files are determined by the chunk option \texttt{cache.path}; by default all cache files are created under a directory \textsf{cache} relative to the current working directory, and if the option value contains a directory (e.g. \texttt{cache.path='cache/abc-'}), cache files will be stored under that directory (automatically created if it does not exist). The cache is invalidated and purged on any changes to the code chunk, including both the R code and chunk options\footnote{One exception is the \texttt{include} option, which is not cached because \texttt{include=TRUE/FALSE} does not affect code evaluation; meanwhile, the value \texttt{getOption('width')} is also cached, so if you change this option, the cache will also be invalidated (this option affects the width of text output)}; this means previous cache files of this chunk are removed (filenames are identified by the chunk label). Unlike \textbf{pgfSweave}, cache files will never accumulate since old cache files will always be removed in \textbf{knitr}. Unlike \textbf{weaver} or \textbf{cacheSweave}, \textbf{knitr} will try to preserve these side-effects: \begin{enumerate} \item printed results: meaning that any output of a code chunk will be loaded into the output document for a cached chunk, although it is not really evaluated. The reason is \textbf{knitr} also cache the output of a chunk as a character string. Note this means graphics output is also cached since it is part of the output. It has been a pain for me for a long time to have to lose output to gain cache; \item loaded packages: after the evaluation of each cached chunk, the list of packages used in the current R session is written to a file under the cache path named \textsf{\_\_packages}; next time if a cached chunk needs to be rebuilt, these packages will be loaded first. The reasons for caching package names are, it can be slow to load some packages, and a package might be loaded in a previous cached chunk which is not available to the next cached chunk when only the latter needs to be rebuilt. Note this only applies to cached chunks, and for uncached chunks, you must always use \emph{library()} to load packages explicitly; \end{enumerate} Although \textbf{knitr} tries to keep some side-effects, there are still other types of side-effects like setting \emph{par()} or \emph{options()} which are not cached. Users should be aware of these special cases, and make sure to clearly separate the code which is not meant to be cached to other chunks which are not cached, e.g., set all global options in the first chunk of a document and do not cache that chunk. Sometimes a cached chunk may need to use objects from other cached chunks, which can bring a serious problem \textendash{} if objects in previous chunks have changed, this chunk will not be aware of the changes and will still use old cached results, unless there is a way to detect such changes from other chunks. There is an option called \texttt{dependson} in \textbf{cacheSweave} which does this job. We can explicitly specify which other chunks this chunk depends on by setting an option like \texttt{dependson='chunkA;chunkB'} or equivalently \texttt{dependson=c('chunkA', 'chunkB')}. Each time the cache of a chunk is rebuilt, all other chunks which depend on this chunk will lose cache, hence their cache will be rebuilt as well. Another way to specify the dependencies among chunks is to use the chunk option \texttt{autodep} and the function \emph{dep\_auto()}. This is an experimental feature borrowed from \textbf{weaver} which frees us from setting chunk dependencies manually. The basic idea is, if a latter chunk uses any objects created from a previous chunk, the latter chunk is said to depend on the previous one. The function \emph{findGlobals()} in the \textbf{codetools} package is used to find out all global objects in a chunk, and according to its documentation, the result is an approximation. Global objects roughly mean the ones which are not created locally, e.g. in the expression \texttt{function() \{y <- x\}}, \texttt{x} should be a global object, whereas \texttt{y} is local. Meanwhile, we also need to save the list of objects created in each cached chunk, so that we can compare them to the global objects in latter chunks. For example, if chunk A created an object \texttt{x} and chunk B uses this object, chunk B must depend on A, i.e. whenever A changes, B must also be updated. When \texttt{autodep=TRUE}, \textbf{knitr} will write out the names of objects created in a cached chunk as well as those global objects in two files named \textsf{\_\_objects} and \textsf{\_\_globals} respectively; later we can use the function \emph{dep\_auto()} to analyze the object names to figure out the dependencies automatically. See \url{https://yihui.name/knitr/demo/cache/} for examples. Yet another way to specify dependencies is \emph{dep\_prev()}: this is a conservative approach which sets the dependencies so that a cached chunk will depend on all its previous chunks, i.e. whenever a previous chunk is updated, all later chunks will be updated accordingly. \subsection{Code Externalization} It can be more convenient to write R code in a separate file, rather than mixing it into a \LaTeX{} document; for example, we can run R code successively in a pure R script from one chunk to the other without jumping through other texts. Since I prefer using \LyX{} to write reports, Sweave is even more inconvenient because I have to recompile the whole document each time, even if I only want to know the results of a single chunk. Therefore \textbf{knitr} introduced the feature of code externalization to a separate R script. Currently the setting is like this: the R script also uses chunk labels (marked in the form \texttt{\#\# -{}-{}-{}- chunk-label} by default); if the code chunk in the input document is empty, \textbf{knitr} will match its label with the label in the R script to input external R code. For example, suppose this is a code chunk labelled as \texttt{Q1} in an R script named \textsf{homework1-xie.R} which is under the same directory as the Rnw document: <>= ## ---- Q1 --------------------- gcd = function(m, n) { while ((r <- m %% n) != 0) { m = n; n = r } n } @ In the Rnw document, we can first read the script using the function \emph{read\_chunk()}: <>= read_chunk('homework1-xie.R') @ This is usually done in an early chunk, and we can use the chunk \texttt{Q1} later in the Rnw document: <>= cat('<>=','@',sep='\n') @ Different documents can read the same R script, so the R code can be reusable across different input documents. \subsection{Evaluation of Chunk Options\label{subsec:conditional}} By default \textbf{knitr} uses a new syntax to parse chunk options: it treats them as function arguments instead of a text string to be split to obtain option values. This gives the user much more power than the old syntax; we can pass arbitrary R objects to chunk options besides simple ones like \texttt{TRUE}/\texttt{FALSE}, numbers and character strings. The page \url{https://yihui.name/knitr/demo/sweave/} has given two examples to show the advantages of the new syntax. Here we show yet another useful application. Before \textbf{knitr} 0.3, there was a feature named ``conditional evaluation''\footnote{request from \url{https://plus.google.com/u/0/116405544829727492615/posts/43WrRUffjzK}}. The idea is, instead of setting chunk options \texttt{eval} and \texttt{echo} to be \texttt{TRUE} or \texttt{FALSE} (constants), their values can be controlled by global variables in the current R session. This enables \textbf{knitr} to conditionally evaluate code chunks according to variables. For example, here we assign \texttt{TRUE} to a variable \texttt{dothis}: <>= dothis=TRUE @ In the next chunk, we set chunk options \texttt{eval=dothis} and \texttt{echo=!dothis}, both are valid R expressions since the variable \texttt{dothis} exists. As we can see, the source code is hidden, but it was indeed evaluated: <>= print('you cannot see my source because !dothis is FALSE') @ Then we set \texttt{eval=dothis} and \texttt{echo=dothis} for another chunk: <>= dothis @ If we change the value of \texttt{dothis} to \texttt{FALSE}, neither of the above chunks will be evaluated any more. Therefore we can control many chunks with a single variable, and present results selectively. This old feature requires \textbf{knitr} to treat \texttt{eval} and \texttt{echo} specially, and we can easily see that it is no longer necessary with the new syntax: \texttt{eval=dothis} will tell R to find the variable \texttt{dothis} automatically just like we call a function \texttt{foobar(eval = dothis)}. What is more, all options will be evaluated as R expressions unless they are already constants which do not need to be evaluated, so this old feature has been generalized to all other options naturally. \subsection{Customization} The \textbf{knitr} package is ready for customization. Both the patterns and hooks can be customized; see the package website for details. Here I show an example on how to save \textbf{rgl} plots \citep{R-rgl} using a customized hook function. First we define a hook named \texttt{rgl} using the function \emph{hook\_rgl()} in \textbf{rgl}: <>= library(rgl) knit_hooks$set(rgl = hook_rgl) head(hook_rgl) # the hook function is defined as this @ Then we only have to set the chunk option \texttt{rgl=TRUE}: <>= library(rgl) demo('bivar', package='rgl', echo=FALSE) par3d(zoom=.7) @ Due to the flexibility of output hooks, \textbf{knitr} supports several different output formats. The implementation is fairly easy, e.g., for \LaTeX{} we put R output in \texttt{verbatim} environments, and in HTML, it is only a matter of putting output in \texttt{div} layers. These are simply character string operations. Many demos in \url{https://yihui.name/knitr/demos} show this idea clearly. This manual did not cover all the features of \textbf{knitr}, and users are encouraged to thumb through the website to know more possible features. \section{Editors} You can use any text editors to write the source documents, but some have built-in support for \textbf{knitr}. Both RStudio (\url{http://www.rstudio.org}) and \LyX{} (\url{http://www.lyx.org}) have full support for \textbf{knitr}, and you can compile the document to PDF with just one click. See \url{https://yihui.name/knitr/demo/rstudio/} and \url{https://yihui.name/knitr/demo/lyx/} respectively. It is also possible to support other editors like \href{https://yihui.name/knitr/demo/eclipse/}{Eclipse}, \href{https://yihui.name/knitr/demo/editors/}{Texmaker and WinEdt}; see the demo list in the website for configuration instructions. \section*{About This Document} This manual was written in \LyX{} and compiled with \textbf{knitr} (version \Sexpr{packageVersion('knitr')}). The \LyX{} source and the Rnw document exported from \LyX{} can be found under these directories: <>= system.file('examples', 'knitr-manual.lyx', package='knitr') # lyx source system.file('examples', 'knitr-manual.Rnw', package='knitr') # Rnw source @ You can use the function \emph{knit()} to knit the Rnw document (remember to put the two \textsf{.bib} files under the same directory), and you need to make sure all the R packages used in this document are installed: <>= install.packages(c('animation', 'rgl', 'tikzDevice', 'ggplot2')) @ Feedback and comments on this manual and the package are always welcome. Bug reports and feature requests can be sent to \url{https://github.com/yihui/knitr/issues}, and questions can be delivered to the \href{mailto:knitr@googlegroups.com}{mailing list} \url{https://groups.google.com/group/knitr}. % when knitr is updated, this chunk will be updated; why? <>= # write all packages in the current session to a bib file write_bib(c(.packages(), 'evaluate', 'formatR', 'highr'), file = 'knitr-packages.bib') @ \bibliographystyle{jss} \bibliography{knitr-manual,knitr-packages} \end{document} knitr/inst/examples/knitr-minimal.brew0000644000175100001440000000011112235534407017644 0ustar hornikusersSee https://github.com/yihui/knitr-examples/blob/master/004-minimal.brew knitr/inst/examples/knitr-spin.Rmd0000644000175100001440000000245413142522202016752 0ustar hornikusersThis is a special R script which can be used to generate a report. You can write normal text in roxygen comments. First we set up some options (you do not have to do this): ```{r setup, include=FALSE} library(knitr) opts_chunk$set(fig.path = 'figure/silk-') ``` The report begins here. ```{r test-a, cache=FALSE} # boring examples as usual set.seed(123) x = rnorm(5) mean(x) ``` You can use the special syntax {{code}} to embed inline expressions, e.g. `r mean(x) + 2` is the mean of x plus 2. The code itself may contain braces, but these are not checked. Thus, perfectly valid (though very strange) R code such as `{{2 + 3}} - {{4 - 5}}` can lead to errors because `2 + 3}} - {{4 - 5` will be treated as inline code. Now we continue writing the report. We can draw plots as well. ```{r test-b, fig.width=5, fig.height=5} par(mar = c(4, 4, .1, .1)); plot(x) ``` Actually you do not have to write chunk options, in which case knitr will use default options. For example, the code below has no options attached: ```{r } var(x) quantile(x) ``` And you can also write two chunks successively like this: ```{r test-chisq5} sum(x^2) # chi-square distribution with df 5 ```{r test-chisq4} sum((x - mean(x))^2) # df is 4 now ``` Done. Call spin('knitr-spin.R') to make silk from sow's ear now and knit a lovely purse. knitr/inst/CITATION0000644000175100001440000000321412643241541013533 0ustar hornikuserscitHeader("To cite the 'knitr' package in publications use:") year = sub('.*(2[[:digit:]]{3})-.*', '\\1', meta$Date, perl = TRUE) vers = paste('R package version', meta$Version) citEntry( entry = 'manual', title = paste('knitr:', meta$Title), author = Filter(function(p) 'aut' %in% p$role, as.person(meta$Author)), year = year, note = vers, url = meta$URL, textVersion = paste('Yihui Xie (', year, '). knitr: ', meta$Title, '. ', vers, '.', sep = '') ) citEntry( entry = 'book', title = 'Dynamic Documents with {R} and knitr', author = 'Yihui Xie', publisher = 'Chapman and Hall/CRC', address = 'Boca Raton, Florida', year = '2015', edition = '2nd', note = 'ISBN 978-1498716963', url = meta$URL, textVersion = paste('Yihui Xie (2015)', 'Dynamic Documents with R and knitr.', '2nd edition. Chapman and Hall/CRC. ISBN 978-1498716963') ) citEntry( entry = 'incollection', booktitle = 'Implementing Reproducible Computational Research', editor = 'Victoria Stodden and Friedrich Leisch and Roger D. Peng', title = 'knitr: A Comprehensive Tool for Reproducible Research in {R}', author = 'Yihui Xie', publisher = 'Chapman and Hall/CRC', year = '2014', note = 'ISBN 978-1466561595', url = 'http://www.crcpress.com/product/isbn/9781466561595', textVersion = paste('Yihui Xie (2014)', 'knitr: A Comprehensive Tool for Reproducible Research in R.', 'In Victoria Stodden, Friedrich Leisch and Roger D. Peng, editors,', 'Implementing Reproducible Computational Research.', 'Chapman and Hall/CRC. ISBN 978-1466561595') ) knitr/inst/misc/0000755000175100001440000000000013107760267013340 5ustar hornikusersknitr/inst/misc/R.css0000644000175100001440000000140712235534430014245 0ustar hornikusers* { font-family: "Trebuchet MS", "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Arial, sans-serif; font-size: 14px; } body { padding: 0 5px; margin: 0 auto; width: 80%; max-width: 60em; /* 960px */ } h1, h2, h3, h4, h5, h6 { color: #666; } h1, h2 { text-align: center; } h1 { font-size: x-large; } h2, h3 { font-size: large; } h4, h6 { font-style: italic; } h3 { border-left: solid 5px #ddd; padding-left: 5px; font-variant: small-caps; } p img { display: block; margin: auto; } span, code, pre { font-family: Monaco, "Lucida Console", "Courier New", Courier, monospace; } span.acronym {} span.env { font-style: italic; } span.file {} span.option {} span.pkg { font-weight: bold; } span.samp{} dt, p code { background-color: #F7F7F7; } knitr/inst/misc/knitr-template.Rmd0000644000175100001440000000102513142522202016722 0ustar hornikusers`r if (exists('.knitr.title')) I(paste('#', .knitr.title, sep = ''))` `r if (exists('.knitr.author')) I(.knitr.author)` This report was automatically generated with the R package **knitr** (version `r packageVersion('knitr')`). ```{r %sCHUNK_LABEL_HERE} ``` The R session information (including the OS info, R version and all packages used): ```{r session-info, cache=FALSE} sessionInfo() Sys.time() ```{r clean-up, include=FALSE} if (exists('.knitr.title')) rm(.knitr.author) if (exists('.knitr.author')) rm(.knitr.author) ``` knitr/inst/misc/tikz2pdf.tex0000644000175100001440000000034513142522202015601 0ustar hornikusers\documentclass{article} \include{preview} \usepackage[pdftex,active,tightpage]{preview} \usepackage{amsmath} \usepackage{tikz} \usetikzlibrary{matrix} \begin{document} \begin{preview} %% TIKZ_CODE %% \end{preview} \end{document} knitr/inst/misc/tweak_bib.csv0000644000175100001440000000524313142526144016001 0ustar hornikusers"package","author" "BiplotGUI","Anthony la Grange and N. J. le Roux and P.J. Rousseeuw and I. Ruts and J. W. Tukey" "CircStats","Ulric Lund and Claudio Agostinelli" "ElemStatLearn","Kjetil Halvorsen" "Fahrmeir","Kjetil Halvorsen" "Hmisc","Harrell, Jr., Frank E" "Hmisc","Frank E. {Harrell, Jr.}" "R2SWF","Yixuan Qiu and Yihui Xie and Cameron Bracken" "R2WinBUGS","Andrew Gelman and Sibylle Sturtz and Uwe Ligges and Gregor Gorjanc and Jouni Kerman" "RODBC","Brian Ripley and Michael Lapsley" "RgoogleMaps","Markus Loecher" "Sleuth2","F. L. Ramsey and D. W. Schafer and Jeannie Sifneos and Berwin A. Turlach" "ade4","Stéphane Dray and Anne-Béatrice Dufour and Jean Thioulouse and Thibaut Jombart and Sandrine Pavoine and Jean R. Lobry and Sébastien Ollier and Aurélie Siberchicot and Daniel Chessel" "akima","H. Akima and Albrecht Gebhardt and Thomas Petzoldt and Martin Maechler" "ash","David W. Scott and Albrecht Gebhardt and Stephen Kaluzny" "bcpa","Jose Claudio Faria and Clarice Garcia Borges Demetrio" "bitops","Steve Dutky and Martin Maechler" "cacheSweave","Roger D. Peng" "cat","Ted Harding and Fernando Tusell and Joseph L. Schafer" "contrast","Max Kuhn and Steve Weston and Jed Wing and James Forester" "date","Terry Therneau and Thomas Lumley and Kjetil Halvorsen and Kurt Hornik" "digest","Dirk Eddelbuettel" "epiR","Mark Stevenson and Telmo Nunes and Cord Heuer and Jonathon Marshall and Javier Sanchez and Ron Thornton and Jeno Reiczigel and Jim Robison-Cox and Paola Sebastiani and Peter Solymos" "flashClust","Fionn Murtagh and {R development team} and Peter Langfelder" "foreach","{Revolution Analytics} and Steve Weston}" "fortunes","Achim Zeileis and the R community" "gWidgets","John Verzani" "gee","Vincent J Carey and Thomas Lumley and Brian Ripley" "gmodels","Gregory R. Warnes andBen Bolker and Thomas Lumley and Randall C Johnson and Randall C. Johnson" "hexbin","Dan Carr and Nicholas Lewin-Koh and Martin Maechler" "leaps","Thomas Lumley" "mapproj","Doug McIlroy and Ray Brownrigg and Thomas P Minka and Roger Bivand" "maps","Ray Brownrigg" "mathgraph","Patrick J. Burns and Nick Efthymiou and Claus Dethlefsen" "oz","Bill Venables and Kurt Hornik" "pbivnorm","Alan Genz and Brenton Kenkel" "pscl","Simon Jackman and Alex Tahk and Achim Zeileis and Christina Maimone and Jim Fearon" "quadprog","Berwin A. Turlach and Andreas Weingessel" "randomForest","Leo Breiman and Adele Cutler and Andy Liaw and Matthew Wiener" "rgl","Daniel Adler and Duncan Murdoch" "rms","Frank E. {Harrell, Jr.}" "robustbase","Valentin Todorov and Andreas Ruckstuhl and Matias Salibian-Barrera and Tobias Verbeke and Manuel Koller and Martin Maechler" "sm","Adrian Bowman and Adelchi Azzalini" "tuneR","Uwe Ligges" knitr/inst/misc/docco-template.html0000644000175100001440000000201513106757323017122 0ustar hornikusers #!title# #!mathjax# #!header#
#!html_output#
h
knitr/inst/misc/knitr.sty0000644000175100001440000000145212235534430015222 0ustar hornikusers\usepackage{framed} \makeatletter \newenvironment{kframe}{% \def\at@end@of@kframe{}% \ifinner\ifhmode% \def\at@end@of@kframe{\end{minipage}}% \begin{minipage}{\columnwidth}% \fi\fi% \def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep \colorbox{shadecolor}{##1}\hskip-\fboxsep % There is no \\@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \@setminipage}}% {\par\unskip\endMakeFramed% \at@end@of@kframe} \makeatother \definecolor{shadecolor}{rgb}{.97, .97, .97} \definecolor{messagecolor}{rgb}{0, 0, 0} \definecolor{warningcolor}{rgb}{1, 0, 1} \definecolor{errorcolor}{rgb}{1, 0, 0} \newenvironment{knitrout}{}{} % an empty environment to be redefined in TeX knitr/inst/misc/docco-classic.html0000644000175100001440000000314413106761727016737 0ustar hornikusers #!title# #!mathjax# #!header#
#!html_output#
knitr/inst/misc/knitr-template.Rnw0000644000175100001440000000320013142522202016743 0ustar hornikusers\documentclass{article} \usepackage[sc]{mathpazo} \renewcommand{\sfdefault}{lmss} \renewcommand{\ttdefault}{lmtt} \usepackage[T1]{fontenc} \usepackage{geometry} \geometry{verbose,tmargin=2.5cm,bmargin=2.5cm,lmargin=2.5cm,rmargin=2.5cm} \setcounter{secnumdepth}{2} \setcounter{tocdepth}{2} \usepackage[unicode=true,pdfusetitle, bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2, breaklinks=false,pdfborder={0 0 1},backref=false,colorlinks=false] {hyperref} \hypersetup{ pdfstartview={XYZ null null 1}} \makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. \renewcommand{\textfraction}{0.05} \renewcommand{\topfraction}{0.8} \renewcommand{\bottomfraction}{0.8} \renewcommand{\floatpagefraction}{0.75} \makeatother \begin{document} <>= options(width=90) opts_chunk$set(out.width = '.6\\linewidth') .knitr.title = if (exists('.knitr.title')) paste('\\title{', .knitr.title, '}', sep = '') else '' .knitr.author = if (nzchar(.knitr.title) && exists('.knitr.author')) { paste('\\author{', .knitr.author, '%\n', '\\thanks{This report is automatically generated with the R package \\textbf{knitr} (version ', packageVersion('knitr'), ').}}', sep = '') } else '' @ \Sexpr{.knitr.title} \Sexpr{.knitr.author} \Sexpr{if (nzchar(.knitr.title)) '\\maketitle'} The results below are generated from an R script. <<%sCHUNK_LABEL_HERE>>= @ The R session information (including the OS info, R version and all packages used): <>= sessionInfo() Sys.time() @ <>= rm(.knitr.author); rm(.knitr.author) @ \end{document} knitr/inst/misc/docco-classic.css0000644000175100001440000000350012456653663016565 0ustar hornikusers/* Derived from the Docco package by Jeremy Ashkenas: https://github.com/jashkenas/docco/ */ body { font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; height:100%; font-size: 16px; line-height: 24px; color: #30404f; margin: 0; padding: 0; } h1, h2, h3, h4, h5, h6 { color: #112233; line-height: 1em; font-weight: normal; margin: 0 0 15px 0; } p { margin: 0 0 15px 0; font-size:17px; } #footer p{ margin:0; font-size:12px; text-align: center; } a{ color:#0088cc; text-decoration:none; } a:hover,a:focus{ color:#005580; text-decoration:underline; } #container { position: relative; margin: 0; height:100%; } body > #container { height: auto; min-height: 100%; } table{ width:100%; border: 0; outline: 0; } td.docs{ width: 50%; text-align: left; vertical-align: top; padding: 10px 25px 1px 50px; } td.code{ background: #f5f5ff; padding: 10px 25px 1px 50px; overflow-x: hidden; vertical-align: top; } code{ font-size:12px; margin: 0; padding: 0; } td.docs code{ background: #f8f8ff; border: 1px solid #dedede; font-size: 80%; padding: 0 0.2em; } td.docs img{ max-width: 100%; } pre code{ padding:2px 4px; background:#f5f5ff; } td.code pre code{ line-height: 18px; } .pilwrap { position: relative; } .pilcrow { font: 12px Arial; text-decoration: none; color: rgb(69, 69, 69); position: absolute; top: 3px; left: -20px; padding: 1px 2px; opacity: 0; } td.docs:hover .pilcrow { opacity: 1; } blockquote { border-left: 4px solid #DDD; padding: 0 15px; color: #777; } div.handler{ width: 5px; padding: 0; cursor: col-resize; position: absolute; z-index: 5; } knitr/inst/misc/Sweavel.sty0000644000175100001440000000544512235534431015510 0ustar hornikusers% Source: http://biostat.mc.vanderbilt.edu/wiki/pub/Main/SweaveTemplate/Sweavel.sty % Author: Frank Harrell (with slight tweaks by Yihui Xie) % Usage: \usepackage{Sweavel} % To change size of R code and output, use e.g.: \def\Sweavesize{\normalsize} % To change just the size of output, use e.g.: \def\Routsize{\smaller[2]} % To change colors of R code, output, and commands, use e.g.: % \def\Rcolor{\color{black}} % \def\Routcolor{\color{green}} % \def\Rcommentcolor{\color{red}} % To change background color or R code and/or output, use e.g.: % \def\Rbackground{\color{white}} % \def\Routbackground{\color{white}} % To use rgb specifications use \color[rgb]{ , , } % To use gray scale use e.g. \color[gray]{0.5} % If you change any of these after the first chunk is produced, the % changes will have effect only for the next chunk. \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{Sweavel}{} % substitute for Sweave.sty using % listings package with relsize \RequirePackage{listings,fancyvrb,color,relsize} \providecommand{\Sweavesize}{\smaller} \providecommand{\Routsize}{\Sweavesize} \providecommand{\Rcolor}{\color[rgb]{0, 0.5, 0.5}} \providecommand{\Routcolor}{\color[rgb]{0.461, 0.039, 0.102}} \providecommand{\Rcommentcolor}{\color[rgb]{0.101, 0.043, 0.432}} \providecommand{\Rbackground}{\color[gray]{0.91}} \providecommand{\Routbackground}{\color[gray]{0.935}} % Can specify \color[gray]{1} for white background or just \color{white} \lstdefinestyle{Rstyle}{fancyvrb=false,escapechar=`,language=R,% basicstyle={\Rcolor\Sweavesize},% some want \ttfamily too backgroundcolor=\Rbackground,% showstringspaces=false,% keywordstyle=\Rcolor,% commentstyle={\Rcommentcolor\ttfamily\itshape},% literate={<-}{{$\leftarrow$}}2{<<-}{{$\twoheadleftarrow$}}2{~}{{$\sim$}}1{<=}{{$\leq$}}2{>=}{{$\geq$}}2{^}{{$^{\scriptstyle\wedge}$}}1,% alsoother={$},% alsoletter={.<-},% otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,/},% escapeinside={(*}{*)}}% % Other options of interest: % frame=single,framerule=0.1pt,framesep=1pt,rulecolor=\color{blue}, % numbers=left,numberstyle=\tiny,stepnumber=1,numbersep=7pt, % keywordstyle={\bf\Rcolor} \lstdefinestyle{Routstyle}{fancyvrb=false,literate={~}{{$\sim$}}1{R^2}{{$R^{2}$}}2{^}{{$^{\scriptstyle\wedge}$}}1{R-squared}{{$R^{2}$}}2,% frame=single,framerule=0.2pt,framesep=1pt,basicstyle=\Routcolor\Routsize\ttfamily,% backgroundcolor=\Routbackground} \newenvironment{Schunk}{}{} \lstnewenvironment{Sinput}{\lstset{style=Rstyle}}{} \lstnewenvironment{Scode}{\lstset{style=Rstyle}}{} \lstnewenvironment{Soutput}{\lstset{style=Routstyle}}{} knitr/inst/misc/stitch-test.R0000644000175100001440000000022413142522202015714 0ustar hornikusers## title: A test script for the function stitch() ## author: Yihui Xie set.seed(1121) (x = rnorm(20)) mean(x);var(x) boxplot(x) hist(x, main = '') knitr/inst/misc/gWidgetsWWW2-knitr.R0000644000175100001440000000130613142522202017034 0ustar hornikuserslibrary(gWidgetsWWW2) w = gwindow('An R Notebook') sb = gstatusbar('Powered by Rook, gWidgetsWWW2 and knitr', container = w) g = gframe('An R Notebook based on knitr', use.scrollwindow = TRUE, horizontal = FALSE, container = w) gbutton('Knit', container = g, handler = function(h, ...) { library(knitr) svalue(g3) = try(knit2html(text = svalue(g1), fragment.only = TRUE)) }) g0 = ggroup(container = g) code = readLines(system.file('examples', 'knitr-minimal.Rmd', package = 'knitr')) # g1 = gtext(code, container = g, use.codemirror = TRUE, width = 500) g1 = gtext(code, container = g0, width = 500, height = 500) g2 = ggroup(cont = g0, expand = TRUE) g3 = ghtml('results here', container = g2) knitr/inst/misc/knitr.css0000644000175100001440000000067612506347156015212 0ustar hornikusers.knitr .inline { background-color: #f7f7f7; border:solid 1px #B0B0B0; } .error { font-weight: bold; color: #FF0000; } .warning { font-weight: bold; } .message { font-style: italic; } .source, .output, .warning, .error, .message { padding: 0 1em; border:solid 1px #F7F7F7; } .source { background-color: #F7F7F7; } .rimage .left { text-align: left; } .rimage .right { text-align: right; } .rimage .center { text-align: center; } knitr/inst/misc/knitr-template.Rhtml0000644000175100001440000000174413142522202017276 0ustar hornikusers <!--rinline I(.knitr.title) -->

This report is automatically generated with the R package knitr (version ) .

The R session information (including the OS info, R version and all packages used):

knitr/inst/misc/datatables.html0000644000175100001440000000055312427502713016327 0ustar hornikusers knitr/inst/misc/vignette.css0000644000175100001440000001044412506647014015676 0ustar hornikusersbody { background-color: #fff; margin: 1em auto; max-width: 800px; overflow: visible; padding-left: 2em; padding-right: 2em; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; } #header { text-align: center; } #TOC { clear: both; margin: 0 0 10px 0; padding: 4px; border: 1px solid #CCCCCC; border-radius: 5px; background-color: #f6f6f6; font-size: 13px; line-height: 1.3; } #TOC .toctitle { font-weight: bold; font-size: 15px; margin-left: 5px; } #TOC ul { padding-left: 40px; margin-left: -1.5em; margin-top: 5px; margin-bottom: 5px; } #TOC ul ul { margin-left: -2em; } #TOC li { line-height: 16px; } table:not([class]) { margin: auto; min-width: 40%; border-width: 1px; border-color: #DDDDDD; border-style: outset; border-collapse: collapse; } table[summary="R argblock"] { width: 100%; border: none; } table:not([class]) th { border-width: 2px; padding: 5px; border-style: inset; } table:not([class]) td { border-width: 1px; border-style: inset; line-height: 18px; padding: 5px 5px; } table:not([class]), table:not([class]) th, table:not([class]) td { border-left-style: none; border-right-style: none; } table:not([class]) tr.odd { background-color: #f7f7f7; } p { margin: 0.5em 0; } blockquote { background-color: #f6f6f6; padding: 13px; padding-bottom: 1px; } hr { border-style: solid; border: none; border-top: 1px solid #777; margin: 28px 0; } dl { margin-left: 0; } dl dd { margin-bottom: 13px; margin-left: 13px; } dl dt { font-weight: bold; } ul { margin-top: 0; } ul li { list-style: circle outside; } ul ul { margin-bottom: 0; } pre, code { background-color: #f5f5f5; border-radius: 3px; color: #333; } pre { overflow-x: auto; border-radius: 3px; margin: 5px 0 10px 0; padding: 10px; } pre:not([class]) { background-color: white; border: #f5f5f5 1px solid; } pre:not([class]) code { color: #444; background-color: white; } code { font-family: monospace; font-size: 90%; } p > code, li > code { padding: 2px 4px; color: #d14; border: 1px solid #e1e1e8; white-space: inherit; } div.figure { text-align: center; } table > caption, div.figure p.caption { font-style: italic; } table > caption span, div.figure p.caption span { font-style: normal; font-weight: bold; } p { margin: 0 0 10px; } table:not([class]) { margin: auto auto 10px auto; } img:not([class]) { background-color: #FFFFFF; padding: 2px; border-radius: 3px; border: 1px solid #CCCCCC; margin: 0 5px; max-width: 100%; } h1 { margin-top: 0; font-size: 35px; line-height: 40px; } h2 { border-bottom: 4px solid #f5f5f5; padding-top: 10px; padding-bottom: 2px; font-size: 145%; } h3 { border-bottom: 2px solid #f5f5f5; padding-top: 10px; font-size: 120%; } h4 { border-bottom: 1px solid #f5f5f5; margin-left: 8px; font-size: 105%; } h5, h6 { border-bottom: 1px solid #ccc; font-size: 105%; } a { color: #0033dd; text-decoration: none; } a:hover { color: #6666ff; } a:visited { color: #800080; } a:visited:hover { color: #BB00BB; } a[href^="http:"] { text-decoration: underline; } a[href^="https:"] { text-decoration: underline; } div.r-help-page { background-color: #f9f9f9; border-bottom: #ddd 1px solid; margin-bottom: 10px; padding: 10px; } div.r-help-page:hover { background-color: #f4f4f4; } /* Class described in https://benjeffrey.com/posts/pandoc-syntax-highlighting-css Colours from https://gist.github.com/robsimmons/1172277 */ code > span.kw { color: #555; font-weight: bold; } /* Keyword */ code > span.dt { color: #902000; } /* DataType */ code > span.dv { color: #40a070; } /* DecVal (decimal values) */ code > span.bn { color: #d14; } /* BaseN */ code > span.fl { color: #d14; } /* Float */ code > span.ch { color: #d14; } /* Char */ code > span.st { color: #d14; } /* String */ code > span.co { color: #888888; font-style: italic; } /* Comment */ code > span.ot { color: #007020; } /* OtherToken */ code > span.al { color: #ff0000; font-weight: bold; } /* AlertToken */ code > span.fu { color: #900; font-weight: bold; } /* Function calls */ code > span.er { color: #a61717; background-color: #e3d2d2; } /* ErrorTok */ knitr/inst/misc/vignette.html0000644000175100001440000000121112402216050016025 0ustar hornikusers knitr/inst/misc/framed.sty0000644000175100001440000005366112611251566015346 0ustar hornikusers% framed.sty v 0.96 2011/10/22 % Copyright (C) 1992-2011 by Donald Arseneau (asnd@triumf.ca) % These macros may be freely transmitted, reproduced, or modified % for any purpose provided that this notice is left intact. % %====================== Begin Instructions ======================= % % framed.sty % ~~~~~~~~~~ % Create framed, shaded, or differently highlighted regions that can % break across pages. The environments defined are % framed - ordinary frame box (\fbox) with edge at margin % oframed - framed with open top/bottom at page breaks % shaded - shaded background (\colorbox) bleeding into margin % shaded* - shaded background (\colorbox) with edge at margin % snugshade - shaded with tight fit around text (esp. in lists) % snugshade* - like snugshade with shading edge at margin % leftbar - thick vertical line in left margin % % to be used like % \begin{framed} % copious text % \end{framed} % % But the more general purpose of this package is to facilitate the % definition of new environments that take multi-line material, % wrap it with some non-breakable formatting (some kind of box or % decoration) and allow page breaks in the material. Such environments % are defined to declare (or use) \FrameCommand for applying the boxy % decoration, and \MakeFramed{settings} ... \endMakeFramed wrapped % around the main text argument (environment body). % % The "framed" environment uses "\fbox", by default, as its "\FrameCommand" % with the additional settings "\fboxrule=\FrameRule" and "\fboxsep=\FrameSep". % You can change these lengths (using "\setlength") and you can change % the definition of "\FrameCommand" to use much fancier boxes. % % In fact, the "shaded" environment just redefines \FrameCommand to be % "\colorbox{shadecolor}" (and you have to define the color `"shadecolor"': % "\definecolor{shadecolor}..."). % % Although the intention is for other packages to define the varieties % of decoration, a command "\OpenFbox" is defined for frames with open % tops or bottoms, and used for the "oframed" environment. This facility % is based on a more complex and capable command "\CustomFBox" which can % be used for a wider range of frame styles. One such style of a title-bar % frame with continuation marks is provided as an example. It is used by % the "titled-frame" environment. To make use of "titled-frame" in your % document, or the "\TitleBarFrame" command in your own environment % definitions, you must define the colors TFFrameColor (for the frame) % and a contrasting TFTitleColor (for the title text). % % A page break is allowed, and even encouraged, before the framed % environment. If you want to attach some text (a box title) to the % frame, then the text should be inserted by \FrameCommand so it cannot % be separated from the body. % % The contents of the framed regions are restricted: % Floats, footnotes, marginpars and head-line entries will be lost. % (Some of these may be handled in a later version.) % This package will not work with the page breaking of multicol.sty, % or other systems that perform column-balancing. % % The MakeFramed environment does the work. Its `settings' argument % should contain any adjustments to the text width (via a setting of % "\hsize"). Here, the parameter "\width" gives the measured extra width % added by the frame, so a common setting is "\advance\hsize-\width" % which reduces the width of the text just enough that the outer edge % of the frame aligns with the margins. The `settings' should also % include a `restore' command -- "\@parboxrestore" or "\FrameRestore" % or something similar; for instance, the snugshade environment uses % settings to eliminate list indents and vertical space, but uses % "\hspace" in "\FrameCommand" to reproduce the list margin ouside the % shading. % % There are actually four variants of "\FrameCommand" to allow different % formatting for each part of an environment broken over pages. Unbroken % text is adorned by "\FrameCommand", whereas split text first uses % "\FirstFrameCommand", possibly followed by "\MidFrameCommand", and % finishing with "\LastFrameCommand". The default definitions for % these three just invokes "\FrameCommand", so that all portions are % framed the same way. See the oframe environment for use of distinct % First/Mid/Last frames. % % Expert commands: % \MakeFramed, \endMakeFramed: the "MakeFramed" environment % \FrameCommand: command to draw the frame around its argument % \FirstFrameCommand: the frame for the first part of a split environment % \LastFrameCommand: for the last portion % \MidFrameCommand: for any intermediate segments % \FrameRestore: restore some text settings, but fewer than \@parboxrestore % \FrameRule: length register; \fboxrule for default "framed". % \FrameSep: length register; \fboxsep for default "framed". % \FrameHeightAdjust: macro; height of frame above baseline at top of page % \OuterFrameSep: vertical space before and after the framed env. Defaults to "\topsep" % % This is still a `pre-production' version because I can think of many % features/improvements that should be made. Also, a detailed manual needs % to be written. Nevertheless, starting with version 0.5 it should be bug-free. % % ToDo: % Test more varieties of list % Improve and correct documentation % Propagation of \marks % Handle footnotes (how??) floats (?) and marginpars. % Stretchability modification. % Make inner contents height/depth influence placement. %======================== End Instructions ======================== \ProvidesPackage{framed}[2011/10/22 v 0.96: framed or shaded text with page breaks] \newenvironment{framed}% using default \FrameCommand {\MakeFramed {\advance\hsize-\width \FrameRestore}}% {\endMakeFramed} \newenvironment{shaded}{% \def\FrameCommand{\fboxsep=\FrameSep \colorbox{shadecolor}}% \MakeFramed {\FrameRestore}}% {\endMakeFramed} \newenvironment{shaded*}{% \def\FrameCommand{\fboxsep=\FrameSep \colorbox{shadecolor}}% \MakeFramed {\advance\hsize-\width \FrameRestore}}% {\endMakeFramed} \newenvironment{leftbar}{% \def\FrameCommand{\vrule width 3pt \hspace{10pt}}% \MakeFramed {\advance\hsize-\width \FrameRestore}}% {\endMakeFramed} % snugshde: Shaded environment that % -- uses the default \fboxsep instead of \FrameSep % -- leaves the text indent unchanged (shading bleeds out) % -- eliminates possible internal \topsep glue (\@setminipage) % -- shrinks inside the margins for lists % An \item label will tend to hang outside the shading, thanks to % the small \fboxsep. \newenvironment{snugshade}{% \def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep \colorbox{shadecolor}{##1}\hskip-\fboxsep % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \newenvironment{snugshade*}{% \def\FrameCommand##1{\hskip\@totalleftmargin \colorbox{shadecolor}{##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \newenvironment{oframed}{% open (top or bottom) framed \def\FrameCommand{\OpenFBox\FrameRule\FrameRule}% \def\FirstFrameCommand{\OpenFBox\FrameRule\z@}% \def\MidFrameCommand{\OpenFBox\z@\z@}% \def\LastFrameCommand{\OpenFBox\z@\FrameRule}% \MakeFramed {\advance\hsize-\width \FrameRestore}% }{\endMakeFramed} % A simplified entry to \CustomFBox with two customized parameters: % the thicknesses of the top and bottom rules. Perhaps we want to % use less \fboxsep on the open edges? \def\OpenFBox#1#2{\fboxsep\FrameSep \CustomFBox{}{}{#1}{#2}\FrameRule\FrameRule} % \CustomFBox is like an amalgamation of \fbox and \@frameb@x, % so it can be used by an alternate to \fbox or \fcolorbox, but % it has more parameters for various customizations. % Parameter #1 is inserted (in vmode) right after the top rule % (useful for a title or assignments), and #2 is similar, but % inserted right above the bottom rule. % The thicknesses of the top, bottom, left, and right rules are % given as parameters #3,#4,#5,#6 respectively. They should be % \fboxrule or \z@ (or some other thickness). % The text argument is #7. % An instance of this can be used for the frame of \fcolorbox by % locally defining \fbox before \fcolorbox; e.g., % \def\fbox{\CustomFBox{}{}\z@\z@\fboxrule\fboxrule}\fcolorbox % % Do we need to use different \fboxsep on different sides too? % \long\def\CustomFBox#1#2#3#4#5#6#7{% \leavevmode\begingroup \setbox\@tempboxa\hbox{% \color@begingroup \kern\fboxsep{#7}\kern\fboxsep \color@endgroup}% \hbox{% % Here we calculate and shift for the depth. Done in % a group because one of the arguments might be \@tempdima % (we could use \dimexpr instead without grouping). \begingroup \@tempdima#4\relax \advance\@tempdima\fboxsep \advance\@tempdima\dp\@tempboxa \expandafter\endgroup\expandafter \lower\the\@tempdima\hbox{% \vbox{% \hrule\@height#3\relax #1% \hbox{% \vrule\@width#5\relax \vbox{% \vskip\fboxsep % maybe these should be parameters too \copy\@tempboxa \vskip\fboxsep}% \vrule\@width#6\relax}% #2% \hrule\@height#4\relax}% }% }% \endgroup } % A particular type of titled frame with continuation marks. % Parameter #1 is the title, repeated on each page. \newenvironment{titled-frame}[1]{% \def\FrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame{\textbf{#1}}}% \def\FirstFrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame[$\blacktriangleright$]{\textbf{#1}}}% \def\MidFrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame[$\blacktriangleright$]{\textbf{#1\ (cont)}}}% \def\LastFrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame{\textbf{#1\ (cont)}}}% \MakeFramed{\advance\hsize-20pt \FrameRestore}}% % note: 8 + 2 + 8 + 2 = 20. Don't use \width because the frame title % could interfere with the width measurement. {\endMakeFramed} % \TitleBarFrame[marker]{title}{contents} % Frame with a label at top, optional continuation marker at bottom right. % Frame color is TFFrameColor and title color is a contrasting TFTitleColor; % both need to be defined before use. The frame itself use \fboxrule and % \fboxsep. If the title is omitted entirely, the title bar is omitted % (use a blank space to force a blank title bar). % \newcommand\TitleBarFrame[3][]{\begingroup \ifx\delimiter#1\delimiter \let\TF@conlab\@empty \else \def\TF@conlab{% continuation label \nointerlineskip \smash{\rlap{\kern\wd\@tempboxa\kern\fboxrule\kern\fboxsep #1}}}% \fi \let\TF@savecolor\current@color \textcolor{TFFrameColor}{% \CustomFBox {\TF@Title{#2}}{\TF@conlab}% \fboxrule\fboxrule\fboxrule\fboxrule {\let\current@color\TF@savecolor\set@color #3}% }\endgroup } % The title bar for \TitleBarFrame \newcommand\TF@Title[1]{% \ifx\delimiter#1\delimiter\else \kern-0.04pt\relax \begingroup \setbox\@tempboxa\vbox{% \kern0.8ex \hbox{\kern\fboxsep\textcolor{TFTitleColor}{#1}\vphantom{Tj)}}% \kern0.8ex}% \hrule\@height\ht\@tempboxa \kern-\ht\@tempboxa \box\@tempboxa \endgroup \nointerlineskip \kern-0.04pt\relax \fi } \chardef\FrameRestore=\catcode`\| % for debug \catcode`\|=\catcode`\% % (debug: insert space after backslash) \newlength\OuterFrameSep \OuterFrameSep=\maxdimen \relax \def\MakeFramed#1{\par % apply default \OuterFrameSep = \topsep \ifdim\OuterFrameSep=\maxdimen \OuterFrameSep\topsep \fi % measure added width and height; call result \width and \height \fb@sizeofframe\FrameCommand \let\width\fb@frw \let\height\fb@frh % insert pre-penalties and skips \begingroup \skip@\lastskip \if@nobreak\else \penalty9999 % updates \page parameters \ifdim\pagefilstretch=\z@ \ifdim\pagefillstretch=\z@ % not infinitely stretchable, so encourage a page break here \edef\@tempa{\the\skip@}% \ifx\@tempa\zero@glue \penalty-30 \else \vskip-\skip@ \penalty-30 \vskip\skip@ \fi\fi\fi \penalty\z@ % Give a stretchy breakpoint that will always be taken in preference % to the \penalty 9999 used to update page parameters. The cube root % of 10000/100 indicates a multiplier of 0.21545, but the maximum % calculated badness is really 8192, not 10000, so the multiplier % is 0.2301. \advance\skip@ \z@ plus-.5\baselineskip \advance\skip@ \z@ plus-.231\height \advance\skip@ \z@ plus-.231\skip@ \advance\skip@ \z@ plus-.231\OuterFrameSep \vskip-\skip@ \penalty 1800 \vskip\skip@ \fi \addvspace{\OuterFrameSep}% \endgroup % clear out pending page break \penalty\@M \vskip 2\baselineskip \vskip\height \penalty9999 \vskip -2\baselineskip \vskip-\height \penalty9999 % updates \pagetotal |\message{After clearout, \pagetotal=\the\pagetotal, \pagegoal=\the\pagegoal. }% \fb@adjheight \setbox\@tempboxa\vbox\bgroup #1% Modifications to \hsize (can use \width and \height) \textwidth\hsize \columnwidth\hsize } \def\endMakeFramed{\par \kern\z@ \hrule\@width\hsize\@height\z@ % possibly bad \penalty-100 % (\hrule moves depth into height) \egroup %%% {\showoutput\showbox\@tempboxa}% \begingroup \fb@put@frame\FrameCommand\FirstFrameCommand \endgroup \@minipagefalse % In case it was set and not cleared } % \fb@put@frame takes the contents of \@tempboxa and puts all, or a piece, % of it on the page with a frame (\FrameCommand, \FirstFrameCommand, % \MidFrameCommand, or \LastFrameCommand). It recurses until all of % \@tempboxa has been used up. (\@tempboxa must have zero depth.) % #1 = attempted framing command, if no split % #2 = framing command if split % First iteration: Try to fit with \FrameCommand. If it does not fit, % split for \FirstFrameCommand. % Later iteration: Try to fit with \LastFrameCommand. If it does not % fit, split for \MidFrameCommand. \def\fb@put@frame#1#2{\relax \ifdim\pagegoal=\maxdimen \pagegoal\vsize \fi | \message{=============== Entering putframe ====================^^J | \pagegoal=\the\pagegoal, \pagetotal=\the\pagetotal. }% \ifinner \fb@putboxa#1% \fb@afterframe \else \dimen@\pagegoal \advance\dimen@-\pagetotal % natural space left on page \ifdim\dimen@<2\baselineskip % Too little room on page | \message{Page has only \the\dimen@\space room left; eject. }% \eject \fb@adjheight \fb@put@frame#1#2% \else % there's appreciable room left on the page \fb@sizeofframe#1% | \message{\string\pagetotal=\the\pagetotal, | \string\pagegoal=\the\pagegoal, | \string\pagestretch=\the\pagestretch, | \string\pageshrink=\the\pageshrink, | \string\fb@frh=\the\fb@frh. \space} | \message{^^JBox of size \the\ht\@tempboxa\space}% \begingroup % temporarily set \dimen@ to be... \advance\dimen@.8\pageshrink % maximum space available on page \advance\dimen@-\fb@frh\relax % max space available for frame's contents %%% LOOKS SUBTRACTED AND ADDED, SO DOUBLE ACCOUNTING! \expandafter\endgroup % expand \ifdim, then restore \dimen@ to real room left on page \ifdim\dimen@>\ht\@tempboxa % whole box does fit | \message{fits in \the\dimen@. }% % ToDo: Change this to use vsplit anyway to capture the marks % MERGE THIS WITH THE else CLAUSE!!! \fb@putboxa#1% \fb@afterframe \else % box must be split | \message{must be split to fit in \the\dimen@. }% % update frame measurement to use \FirstFrameCommand or \MidFrameCommand \fb@sizeofframe#2% \setbox\@tempboxa\vbox{% simulate frame and flexiblity of the page: \vskip \fb@frh \@plus\pagestretch \@minus.8\pageshrink \kern137sp\kern-137sp\penalty-30 \unvbox\@tempboxa}% \edef\fb@resto@set{\boxmaxdepth\the\boxmaxdepth \splittopskip\the\splittopskip}% \boxmaxdepth\z@ \splittopskip\z@ | \message{^^JPadded box of size \the\ht\@tempboxa\space split to \the\dimen@}% % Split box here \setbox\tw@\vsplit\@tempboxa to\dimen@ | \toks99\expandafter{\splitfirstmark}% | \toks98\expandafter{\splitbotmark}% | \message{Marks are: \the\toks99, \the\toks98. }% \setbox\tw@\vbox{\unvbox\tw@}% natural-sized | \message{Natural height of split box is \the\ht\tw@, leaving | \the\ht\@tempboxa\space remainder. }% % If the split-to size > (\vsize-\topskip), then set box to full size. \begingroup \advance\dimen@\topskip \expandafter\endgroup \ifdim\dimen@>\pagegoal | \message{Frame is big -- Use up the full column. }% \dimen@ii\pagegoal \advance\dimen@ii -\topskip \advance\dimen@ii \FrameHeightAdjust\relax \else % suspect this is implemented incorrectly: % If the split-to size > feasible room_on_page, rebox it smaller. \advance\dimen@.8\pageshrink \ifdim\ht\tw@>\dimen@ | \message{Box too tall; rebox it to \the\dimen@. }% \dimen@ii\dimen@ \else % use natural size \dimen@ii\ht\tw@ \fi \fi % Re-box contents to desired size \dimen@ii \advance\dimen@ii -\fb@frh \setbox\tw@\vbox to\dimen@ii \bgroup % remove simulated frame and page flexibility: \vskip -\fb@frh \@plus-\pagestretch \@minus-.8\pageshrink \unvbox\tw@ \unpenalty\unpenalty \ifdim\lastkern=-137sp % whole box went to next page | \message{box split at beginning! }% % need work here??? \egroup \fb@resto@set \eject % (\vskip for frame size was discarded) \fb@adjheight \fb@put@frame#1#2% INSERTED ??? \else % Got material split off at the head \egroup \fb@resto@set \ifvoid\@tempboxa % it all fit after all | \message{box split at end! }% \setbox\@tempboxa\box\tw@ \fb@putboxa#1% \fb@afterframe \else % it really did split | \message{box split as expected. Its reboxed height is \the\ht\tw@. }% \ifdim\wd\tw@>\z@ \wd\tw@\wd\@tempboxa \centerline{#2{\box\tw@}}% ??? \centerline bad idea \else | \message{Zero width means likely blank. Don't frame it (guess)}% \box\tw@ \fi \hrule \@height\z@ \@width\hsize \eject \fb@adjheight \fb@put@frame\LastFrameCommand\MidFrameCommand \fi\fi\fi\fi\fi } \def\fb@putboxa#1{% \ifvoid\@tempboxa \PackageWarning{framed}{Boxa is void -- discard it. }% \else | \message{Frame and place boxa. }% | %{\showoutput\showbox\@tempboxa}% \centerline{#1{\box\@tempboxa}}% \fi } \def\fb@afterframe{% \nointerlineskip \null %{\showoutput \showlists} \penalty-30 \vskip\OuterFrameSep \relax } % measure width and height added by frame (#1 = frame command) % call results \fb@frw and \fb@frh % todo: a mechanism to handle wide frame titles \newdimen\fb@frw \newdimen\fb@frh \def\fb@sizeofframe#1{\begingroup \setbox\z@\vbox{\vskip-5in \hbox{\hskip-5in #1{\hbox{\vrule \@height 4.7in \@depth.3in \@width 5in}}}% \vskip\z@skip}% | \message{Measuring frame addition for \string#1 in \@currenvir\space | gives ht \the\ht\z@\space and wd \the\wd\z@. }% | %{\showoutput\showbox\z@}% \global\fb@frw\wd\z@ \global\fb@frh\ht\z@ \endgroup } \def\fb@adjheight{% \vbox to\FrameHeightAdjust{}% get proper baseline skip from above. \penalty\@M \nointerlineskip \vskip-\FrameHeightAdjust \penalty\@M} % useful for tops of pages \edef\zero@glue{\the\z@skip} \catcode`\|=\FrameRestore % Provide configuration commands: \providecommand\FrameCommand{% \setlength\fboxrule{\FrameRule}\setlength\fboxsep{\FrameSep}% \fbox} \@ifundefined{FrameRule}{\newdimen\FrameRule \FrameRule=\fboxrule}{} \@ifundefined{FrameSep} {\newdimen\FrameSep \FrameSep =3\fboxsep}{} \providecommand\FirstFrameCommand{\FrameCommand} \providecommand\MidFrameCommand{\FrameCommand} \providecommand\LastFrameCommand{\FrameCommand} % Height of frame above first baseline when frame starts a page: \providecommand\FrameHeightAdjust{6pt} % \FrameRestore has parts of \@parboxrestore, performing a similar but % less complete restoration of the default layout. See how it is used in % the "settings" argument of \MakeFrame. Though not a parameter, \hsize % should be set to the desired total line width available inside the % frame before invoking \FrameRestore. \def\FrameRestore{% \let\if@nobreak\iffalse \let\if@noskipsec\iffalse \let\-\@dischyph \let\'\@acci\let\`\@accii\let\=\@acciii % \message{FrameRestore: % \@totalleftmargin=\the \@totalleftmargin, % \rightmargin=\the\rightmargin, % \@listdepth=\the\@listdepth. }% % Test if we are in a list (or list-like paragraph) \ifnum \ifdim\@totalleftmargin>\z@ 1\fi \ifdim\rightmargin>\z@ 1\fi \ifnum\@listdepth>\z@ 1\fi 0>\z@ % \message{In a list: \linewidth=\the\linewidth, \@totalleftmargin=\the\@totalleftmargin, % \parshape=\the\parshape, \columnwidth=\the\columnwidth, \hsize=\the\hsize, % \labelwidth=\the\labelwidth. }% \@setminipage % snug fit around the item. I would like this to be non-global. % Now try to propageate changes of width from \hsize to list parameters. % This is deficient, but a more advanced way to indicate modification to text % dimensions is not (yet) provided; in particular, no separate left/right % adjustment. \advance\linewidth-\columnwidth \advance\linewidth\hsize \parshape\@ne \@totalleftmargin \linewidth \else % Not in list \linewidth=\hsize %\message{No list, set \string\linewidth=\the\hsize. }% \fi \sloppy } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% knitr/inst/misc/toggleR.js0000644000175100001440000000103312427223356015273 0ustar hornikusers// toggle visibility of R source blocks in R Markdown output function toggle_R() { var x = document.getElementsByClassName('r'); if (x.length == 0) return; function toggle_vis(o) { var d = o.style.display; o.style.display = (d == 'block' || d == '') ? 'none':'block'; } for (i = 0; i < x.length; i++) { var y = x[i]; if (y.tagName.toLowerCase() === 'pre') toggle_vis(y); } } document.write('') knitr/inst/NEWS.Rd0000644000175100001440000000043113142522202013426 0ustar hornikusers\name{NEWS} \title{News for Package 'knitr'} \section{CHANGES IN knitr VERSION 999.999}{ \itemize{ \item This NEWS file is only a placeholder. The version 999.999 does not really exist. Please read the NEWS on Github: \url{https://github.com/yihui/knitr/releases} } } knitr/inst/bin/0000755000175100001440000000000012304670066013150 5ustar hornikusersknitr/inst/bin/knit0000755000175100001440000000166612235534431014052 0ustar hornikusers#!/usr/bin/env Rscript local({ p = commandArgs(TRUE) if (length(p) == 0L || any(c('-h', '--help') %in% p)) { message('usage: knit input [input2 input3] [-n] [-o output output2 output3] -h, --help to print help messages -n, --no-convert do not convert tex to pdf, markdown to html, etc -o output filename(s) for knit()') q('no') } library(knitr) o = match('-o', p) if (is.na(o)) output = NA else { output = tail(p, length(p) - o) p = head(p, o - 1L) } nc = c('-n', '--no-convert') knit_fun = if (any(nc %in% p)) { p = setdiff(p, nc) knit } else { if (length(p) == 0L) stop('no input file provided') if (grepl('\\.(R|S)(nw|tex)$', p[1])) { function(x, ...) knit2pdf(x, ..., clean = TRUE) } else { if (grepl('\\.R(md|markdown)$', p[1])) knit2html else knit } } mapply(knit_fun, p, output = output, MoreArgs = list(envir = globalenv())) }) knitr/inst/shiny/0000755000175100001440000000000012304670232013525 5ustar hornikusersknitr/inst/shiny/ui.R0000644000175100001440000000302113142522202014253 0ustar hornikuserslibrary(shiny) # div nbSrc takes source code from div notebook (via Ace editor), and div nbOut # holds results from knitr shinyUI( bootstrapPage( tags$head( tags$title('An R Notebook in Shiny'), tags$script(src = 'http://ajaxorg.github.io/ace/build/src-min-noconflict/ace.js', type = 'text/javascript', charset = 'utf-8'), tags$link(rel = 'stylesheet', type = 'text/css', href = 'ace-shiny.css'), tags$script(src = '//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js', type = 'text/javascript'), tags$script(src = '//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/languages/r.min.js', type = 'text/javascript'), tags$link(rel = 'stylesheet', type = 'text/css', href = '//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/github.min.css'), tags$script(src = '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML', type = 'text/javascript') ), div(id = 'notebook', title = 'Compile notebook: F4\nInsert chunk: Ctrl+Alt+I', paste(c('This is an example taken from the **knitr** package. Press `F4` or `Ctrl+Shift+H` to compile it, and `Ctrl+Alt+I` to insert a code chunk.', '', readLines(system.file('examples', 'knitr-minimal.Rmd', package = 'knitr'))), collapse = '\n')), tags$textarea(id = 'nbSrc', style = 'display: none;'), tags$script(src = 'ace-shiny.js', type = 'text/javascript'), htmlOutput('nbOut'), div(id = 'proxy', submitButton('Knit Notebook')) ) ) knitr/inst/shiny/server.R0000644000175100001440000000121513142522202015147 0ustar hornikuserslibrary(shiny) library(knitr) options(device.ask.default = FALSE) shinyServer(function(input, output) { output$nbOut = reactive({ src = input$nbSrc if (length(src) == 0L || src == '') return('Nothing to show yet...') owd = setwd(tempdir()); on.exit(setwd(owd)) opts_knit$set(root.dir = owd) paste(knit2html(text = src, fragment.only = TRUE, quiet = TRUE), '', sep = '\n') }) }) knitr/inst/shiny/www/0000755000175100001440000000000012304670254014355 5ustar hornikusersknitr/inst/shiny/www/ace-shiny.css0000644000175100001440000000043712235534431016752 0ustar hornikusers#proxy { position: absolute; top: 0; right: 0; display: none; } #notebook { position: absolute; width: 600px; top: 0; left: 0; bottom: 0; } #nbOut { position: absolute; left: 620px; top: 0; right: 0; bottom: 0; padding-right: 5px; overflow-y: scroll; } knitr/inst/shiny/www/ace-shiny.js0000644000175100001440000000352212235534431016574 0ustar hornikusersvar editor = ace.edit("notebook"); editor.setTheme("ace/theme/tomorrow"); editor.getSession().setMode('ace/mode/markdown'); editor.getSession().setUseWrapMode(true); editor.getSession().setTabSize(2); editor.getSession().setFoldStyle('markbegin'); editor.getSession().on('change', function(e) { $('#nbSrc').val(editor.getValue()).change(); }); editor.getSession().selection.on('changeSelection', function(e) { var s = editor.session.getTextRange(editor.getSelectionRange()); if (s == '') s = editor.getValue(); $('#nbSrc').val(s).change(); }); editor.commands.addCommand({ name: 'insertChunk', bindKey: 'Ctrl-Alt-I', exec: function(editor) { editor.insert('```{r}\n\n```\n'); editor.navigateUp(2); } }); editor.commands.addCommand({ name: 'compileNotebook', bindKey: 'F4|Ctrl-Shift-H', exec: function(editor) { $('#proxy button').trigger('click'); } }); $(document).ready(function() { // may pass a url as a query string after ? in the url var h = window.location.search.substring(1); function setSrc(msg) { if (msg) { alert('unable to read URL ' + h + '\n\nusing default R Markdown example'); } $('#nbSrc').val(editor.getValue()); $('#proxy button').trigger('click'); } var w = Math.max($(window).width()/2, 300); $('#notebook').width(w - 10); $('#nbOut').css('left', w + 10 + 'px'); if (h) { $.get(h, {}, function(res) { var data = res.data, str = data.content; if (typeof(str) != 'string') return(setSrc(true)); if (data.encoding == 'base64') { str = str.replace(/\n/g, ''); str = decodeURIComponent(escape(window.atob( str ))); } if (str) { editor.setValue(str); editor.gotoLine(1); setSrc(false); } else setSrc(true); }, 'jsonp') .error(function() { setSrc(true); }); } else setSrc(false); }) knitr/inst/doc/0000755000175100001440000000000013142526154013144 5ustar hornikusersknitr/inst/doc/knitr-markdown.html0000644000175100001440000026407613142526153017017 0ustar hornikusers Package vignettes

This is an example of Markdown vignettes in R. Before R 3.0.0, only Sweave/PDF vignettes were supported in R. Markdown is gaining popularity over the years due to its simplicity, and R 3.0.0 starts to support package vignettes written in R Markdown.

Please note this example is for R Markdown v1 only. If you use R Markdown v2, you should use the vignette engine knitr::rmarkdown instead of knitr::knitr.

Package vignettes

To enable Markdown vignettes in an R package, you need to

  • add *.Rmd files under the vignettes directory
  • add VignetteBuilder: knitr to the DESCRIPTION file
  • specify the vignette engine \VignetteEngine{knitr::knitr} in the Rmd files (inside HTML comments)

View vignettes

And R will load the knitr package to build these vignettes to HTML files, and you can see them when you open the HTML help:

help(package = "YourPackage", help_type = "html")
# or see a standalone list of vignettes
browseVignettes("YourPackage")

Examples

Below are some code chunks as examples.

if (TRUE) cat("_hello_ **markdown**!", "\n")

hello markdown!

Normally you do not need any chunk options.

1 + 1
## [1] 2
10:1
##  [1] 10  9  8  7  6  5  4  3  2  1
rnorm(5)^2
## [1] 0.005529 0.066054 0.622581 3.103760 0.130612
strsplit("hello, markdown vignettes", "")
## [[1]]
##  [1] "h" "e" "l" "l" "o" "," " " "m" "a" "r" "k" "d" "o" "w" "n" " " "v"
## [18] "i" "g" "n" "e" "t" "t" "e" "s"

Feel free to draw beautiful plots and write math \(P(X>x)=\alpha/2\).

n = 300
set.seed(123)
par(mar = c(4, 4, 0.1, 0.1))
plot(rnorm(n), rnorm(n), pch = 21, cex = 5 * runif(n), col = "white", bg = "gray")

plot of chunk unnamed-chunk-2

You can use your own CSS file instead of the built-in style in the markdown package – just set the option markdown.HTML.stylesheet, e.g.

options(markdown.HTML.stylesheet = "path/to/a/custom/style.css")
knitr/inst/doc/knitr-intro.html0000644000175100001440000035404013142526152016316 0ustar hornikusers Not An Introduction to knitr

Not An Introduction to knitr

Yihui Xie

2017-08-09

The knitr package (Xie 2016) is an alternative tool to Sweave based on a different design with more features. This document is not an introduction, but only serves as a placeholder to guide you to the real manuals, which are available on the package website https://yihui.name/knitr/1, and remember to read the help pages of functions in this package. There is a book (Xie 2015) for this package, but it may not be useful to those who prefer digging out information on the web.

Anyway, here is a code chunk that shows you can compile vignettes with knitr as well using R 3.0.x, which supports non-Sweave vignettes:

options(digits = 4)
rnorm(20)
##  [1] -0.18780  1.23830  0.19112  0.48441  0.63060  0.19872  0.41142
##  [8] -1.78417  0.95042 -0.87437 -0.29234  0.27153  0.92738 -0.55520
## [15] -0.36554  1.40357 -1.21470  0.04969  0.90935 -1.27031
fit = lm(dist ~ speed, data = cars)
b = coef(fit)
Regression coefficients.
Estimate Std. Error t value Pr(>|t|)
(Intercept) -17.579 6.7584 -2.601 0.0123
speed 3.932 0.4155 9.464 0.0000

The fitted regression equation is \(Y=-17.5791+3.9324x\).

par(mar = c(4, 4, 1, 0.1))
plot(cars, pch = 20)
abline(fit, col = "red")
A scatterplot with a regression line.

A scatterplot with a regression line.

References

Xie, Yihui. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. http://yihui.name/knitr/.

———. 2016. Knitr: A General-Purpose Package for Dynamic Report Generation in R. http://yihui.name/knitr/.


  1. e.g. the main manual and the graphics manual↩

knitr/inst/doc/datatables.Rmd0000644000175100001440000000250513142522202015704 0ustar hornikusers # jQuery DataTables We can use the JavaScript library [**DataTables**](http://www.datatables.net) to generate enhanced tables in HTML. In the example below, we create a table for the `mtcars` data: ```{r cool, results='asis'} library(knitr) kable(mtcars, 'html', table.attr='id="mtcars_table"') ``` Note we assigned an `id` to the table, and next we use the **DataTables** library to tweak the table. ```js ``` Since this is a Markdown vignette, we need to add the JavaScript libraries as well as some additional CSS files to the HTML header, and this can be done via: ```{r} options(markdown.HTML.header = system.file('misc', 'datatables.html', package = 'knitr')) ``` The file `datatables.html` under the `misc` directory of **knitr** was added to the HTML output. By comparison, below is an ordinary table: ```{r boring, results='asis'} kable(head(mtcars), 'html') ``` This vignette is only a toy example. I'd recommend you to use the **DT** package instead: https://github.com/rstudio/DT knitr/inst/doc/knitr-intro.Rmd0000644000175100001440000000273013142522202016060 0ustar hornikusers--- title: "Not An Introduction to knitr" author: "Yihui Xie" date: "`r Sys.Date()`" bibliography: - ../inst/examples/knitr-packages.bib - ../inst/examples/knitr-manual.bib vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Not an Introduction to knitr} output: knitr:::html_vignette --- The **knitr** package [@R-knitr] is an alternative tool to Sweave based on a different design with more features. This document is not an introduction, but only serves as a placeholder to guide you to the real manuals, which are available on the package website ^[e.g. the [main manual](https://yihui.name/knitr/demo/manual/) and the [graphics manual](https://yihui.name/knitr/demo/graphics/)], and remember to read the help pages of functions in this package. There is a book [@xie2013] for this package, but it may not be useful to those who prefer digging out information on the web. Anyway, here is a code chunk that shows you can compile vignettes with **knitr** as well using R 3.0.x, which supports non-Sweave vignettes: ```{r show-off, tidy=TRUE} options(digits=4) rnorm(20) fit=lm(dist~speed, data=cars) b=coef(fit) ```{r results='asis', echo=FALSE} knitr::kable(summary(fit)$coefficients, caption='Regression coefficients.') ``` The fitted regression equation is $Y=`r b[1]`+`r b[2]`x$. ```{r graphics, fig.cap='A scatterplot with a regression line.'} par(mar=c(4, 4, 1, .1)) plot(cars, pch = 20) abline(fit, col = 'red') ``` ## References knitr/inst/doc/knitr-html.Rhtml0000644000175100001440000000262013142522202016233 0ustar hornikusers An R HTML vignette with knitr

This is an R HTML vignette. The file extension is *.Rhtml, and it has to include a special comment to tell R that this file needs to be compiled by knitr:

<!--
%\VignetteEngine{knitr::knitr}
%\VignetteIndexEntry{The Title of Your Vignette}
-->

Now you can write R code chunks:

You can also embed plots, for example:

For package vignettes, you need to encode images in base64 strings using the knitr::image_uri() function so that the image files are no longer needed after the vignette is compiled. For example, you can add this chunk in the beginning of a vignette:

knitr/inst/doc/knit_print.R0000644000175100001440000000751613142526150015455 0ustar hornikusers## ----normal-print, comment=''-------------------------------------------- head(mtcars) ## ------------------------------------------------------------------------ library(knitr) knit_print # an S3 generic function methods(knit_print) getS3method('knit_print', 'default') # the default method normal_print ## ----collapse=TRUE------------------------------------------------------- knit_print(1:10) knit_print(head(mtcars)) ## ------------------------------------------------------------------------ library(knitr) # define a method for objects of the class data.frame knit_print.data.frame = function(x, ...) { res = paste(c('', '', kable(x)), collapse = '\n') asis_output(res) } ## ----knit-print---------------------------------------------------------- 1 + 1 head(letters) list(a = 1, b = 9:4) head(mtcars) cat('This is cool.') ## ----eval=FALSE, tidy=FALSE---------------------------------------------- # knit_print.classA = function(x, ...) { # # ignore options and inline # } # knit_print.classB = function(x, options, ...) { # # use the chunk option out.height # asis_output(paste( # '', # )) # } # knit_print.classC = function(x, inline = FALSE, ...) { # # different output according to inline=TRUE/FALSE # if (inline) { # 'inline output for classC' # } else { # 'chunk output for classC' # } # } # knit_print.classD = function(x, options, inline = FALSE, ...) { # # use both options and inline # } ## ------------------------------------------------------------------------ dummy_print = function(x, ...) { cat("I do not know what to print!") # this function implicitly returns an invisible NULL } ## ----knit-print, render=dummy_print, collapse=TRUE----------------------- 1 + 1 head(letters) list(a = 1, b = 9:4) head(mtcars) cat('This is cool.') ## ------------------------------------------------------------------------ 1 + 1 invisible(1 + 1) invisible(head(mtcars)) x = 1:10 # invisibly returns 1:10 ## ----eval=FALSE, tidy=FALSE---------------------------------------------- # # pseudo code # knit_print.ggvis = function(x, ...) { # res = ggvis::print_this_object(x) # knitr::asis_output(res, meta = list( # ggvis = list( # version = '0.1.0', # js = system.file('www', 'js', 'ggvis.js', package = 'ggvis'), # css = system.file('www', 'www', 'ggvis.css', package = 'ggvis') # ) # )) # } ## ----tidy=FALSE---------------------------------------------------------- library(knitr) knit_print.foo = function(x, ...) { res = paste('**This is a `foo` object**:', x) asis_output(res, meta = list( js = system.file('www', 'shared', 'shiny.js', package = 'shiny'), css = system.file('www', 'shared', 'shiny.css', package = 'shiny') )) } ## ------------------------------------------------------------------------ new_foo = function(x) structure(x, class = 'foo') new_foo('hello') ## ------------------------------------------------------------------------ str(knit_meta(clean = FALSE)) ## ------------------------------------------------------------------------ new_foo('world') ## ------------------------------------------------------------------------ knit_print.bar = function(x, ...) { asis_output(x, meta = list(head = '')) } new_bar = function(x) structure(x, class = 'bar') new_bar('**hello** world!') new_bar('hello **world**!') ## ------------------------------------------------------------------------ str(knit_meta()) str(knit_meta()) # empty now, because clean = TRUE by default ## ------------------------------------------------------------------------ knitr::asis_output ## ----clean-up, include=FALSE--------------------------------------------- # R compiles all vignettes in the same session, which can be bad rm(list = ls(all = TRUE)) knitr/inst/doc/docco-linear.R0000644000175100001440000000116113142526154015625 0ustar hornikusers## ----hello, results='asis'----------------------------------------------- cat('_hello_ **markdown**!', '\n') ## ------------------------------------------------------------------------ 1+1 10:1 rnorm(5)^2 strsplit('hello, markdown vignettes', '') ## ------------------------------------------------------------------------ n=300; set.seed(123) par(mar=c(4,4,.1,.1)) plot(rnorm(n), rnorm(n), pch=21, cex=5*runif(n), col='white', bg='gray') ## ----header, eval=FALSE-------------------------------------------------- # knit2html(..., markdown.HTML.template = system.file('misc', 'docco-template.html', package='knitr')) knitr/inst/doc/docco-classic.html0000644000175100001440000024445513142526154016556 0ustar hornikusers R Markdown with the Docco Classic Style

R Markdown with the Docco Classic Style

This is an example of Markdown vignettes using the Docco style.

Docco

To use the Docco style for Markdown vignettes in an R package, you need to

  • add *.Rmd files under the vignettes directory
  • add Suggests: knitr and VignetteBuilder: knitr to the DESCRIPTION file
  • specify the vignette engine \VignetteEngine{knitr::docco_classic} in the Rmd files (inside HTML comments)

After building and installing the package, you can view vignettes via

browseVignettes(package = 'Your_Package')

Examples

Below are some code chunks as examples.

cat("_hello_ **markdown**!", "\n")

hello markdown!

Normally you do not need any chunk options.

1 + 1
## [1] 2
10:1
##  [1] 10  9  8  7  6  5  4  3  2  1
rnorm(5)^2
## [1] 2.36677 0.01204 0.26160 0.04578 0.03464
strsplit("hello, markdown vignettes", "")
## [[1]]
##  [1] "h" "e" "l" "l" "o" "," " " "m" "a" "r" "k" "d" "o" "w" "n" " " "v"
## [18] "i" "g" "n" "e" "t" "t" "e" "s"

Feel free to draw beautiful plots and write math \(P(X>x)=\alpha/2\).

plot of chunk unnamed-chunk-2

n = 300
set.seed(123)
par(mar = c(4, 4, 0.1, 0.1))
plot(rnorm(n), rnorm(n), pch = 21, cex = 5 * runif(n), col = "white", bg = "gray")

How does it work

The markdown package (>= v0.6.2) supports custom HTML templates, and the docco engine in knitr uses a custom template to compile Markdown to HTML:

head(knitr::rocco, 5)
##                                                                                   
## 1 function (input, ...)                                                           
## 2 {                                                                               
## 3     out = knit2html(input, ..., stylesheet = system.file("misc",                
## 4         "docco-classic.css", package = "knitr"), template = system.file("misc", 
## 5         "docco-classic.html", package = "knitr"))

That is it.

You probably have noticed that you can adjust the widths of the two columns using your cursor. What is more, press T on your keyboard, and see what happens.

knitr/inst/doc/knit_expand.html0000644000175100001440000004501013142526153016335 0ustar hornikusers Demos of <code>knit_expand()</code>

Demos of knit_expand()

A few simple examples:

library(knitr)
knit_expand(text = "The value of pi is {{pi}}.")
## [1] "The value of pi is 3.14159265358979."
knit_expand(text = "The value of a is {{a}}, so a + 1 is {{a+1}}.", a = rnorm(1))
## [1] "The value of a is 0.81517580544331, so a + 1 is 1.81517580544331."
knit_expand(text = "The area of a circle with radius {{r}} is {{pi*r^2}}", r = 5)
## [1] "The area of a circle with radius 5 is 78.5398163397448"

Any number of variables:

knit_expand(text = "a is {{a}} and b is {{b}}, with my own pi being {{pi}} instead of {{base::pi}}", 
    a = 1, b = 2, pi = 3)
## [1] "a is 1 and b is 2, with my own pi being 3 instead of 3.14159265358979"

Custom delimiter <% %>:

knit_expand(text = "I do not like curly braces, so use % with <> instead: a is <% a %>.", 
    a = 8, delim = c("<%", "%>"))
## [1] "I do not like curly braces, so use % with <> instead: a is 8."

The pyexpander delimiter:

knit_expand(text = "hello $(LETTERS[24]) and $(pi)!", delim = c("$(", ")"))
## [1] "hello X and 3.14159265358979!"

Arbitrary R code:

knit_expand(text = "you cannot see the value of x {{x=rnorm(1)}}but it is indeed created: x = {{x}}")
## [1] "you cannot see the value of x but it is indeed created: x = -1.23805831920307"
res = knit_expand(text = c(" x | x^2", "{{x=1:5;paste(sprintf(\"%2d | %3d\", x, x^2), collapse = \"\n\")}}"))
cat(res)
##  x | x^2
##  1 |   1
##  2 |   4
##  3 |   9
##  4 |  16
##  5 |  25

The m4 example: http://en.wikipedia.org/wiki/M4_(computer_language)

res = knit_expand(text = c("{{i=0;h2=function(x){i<<-i+1;sprintf(\"<h2>%d. %s</h2>\", i, x)} }}<html>", 
    "{{h2(\"First Section\")}}", "{{h2(\"Second Section\")}}", "{{h2(\"Conclusion\")}}", 
    "</html>"))
cat(res)
## <html>
## <h2>1. First Section</h2>
## <h2>2. Second Section</h2>
## <h2>3. Conclusion</h2>
## </html>

Build regression models based on a template; loop through all variables in mtcars:

src = lapply(names(mtcars)[-1], function(i) {
    knit_expand(text = c("# Regression on {{i}}", "```{r lm-{{i}}}", "lm(mpg~{{i}}, data=mtcars)", 
        "```"))
})
# knit the source
res = knit_child(text = unlist(src))
res = paste("<pre><code>", gsub("^\\s*|\\s*$", "", res), "</code></pre>", sep = "")
# Regression on cyl

```r
lm(mpg ~ cyl, data = mtcars)
```

```
## 
## Call:
## lm(formula = mpg ~ cyl, data = mtcars)
## 
## Coefficients:
## (Intercept)          cyl  
##       37.88        -2.88
```
# Regression on disp

```r
lm(mpg ~ disp, data = mtcars)
```

```
## 
## Call:
## lm(formula = mpg ~ disp, data = mtcars)
## 
## Coefficients:
## (Intercept)         disp  
##     29.5999      -0.0412
```
# Regression on hp

```r
lm(mpg ~ hp, data = mtcars)
```

```
## 
## Call:
## lm(formula = mpg ~ hp, data = mtcars)
## 
## Coefficients:
## (Intercept)           hp  
##     30.0989      -0.0682
```
# Regression on drat

```r
lm(mpg ~ drat, data = mtcars)
```

```
## 
## Call:
## lm(formula = mpg ~ drat, data = mtcars)
## 
## Coefficients:
## (Intercept)         drat  
##       -7.52         7.68
```
# Regression on wt

```r
lm(mpg ~ wt, data = mtcars)
```

```
## 
## Call:
## lm(formula = mpg ~ wt, data = mtcars)
## 
## Coefficients:
## (Intercept)           wt  
##       37.29        -5.34
```
# Regression on qsec

```r
lm(mpg ~ qsec, data = mtcars)
```

```
## 
## Call:
## lm(formula = mpg ~ qsec, data = mtcars)
## 
## Coefficients:
## (Intercept)         qsec  
##       -5.11         1.41
```
# Regression on vs

```r
lm(mpg ~ vs, data = mtcars)
```

```
## 
## Call:
## lm(formula = mpg ~ vs, data = mtcars)
## 
## Coefficients:
## (Intercept)           vs  
##       16.62         7.94
```
# Regression on am

```r
lm(mpg ~ am, data = mtcars)
```

```
## 
## Call:
## lm(formula = mpg ~ am, data = mtcars)
## 
## Coefficients:
## (Intercept)           am  
##       17.15         7.24
```
# Regression on gear

```r
lm(mpg ~ gear, data = mtcars)
```

```
## 
## Call:
## lm(formula = mpg ~ gear, data = mtcars)
## 
## Coefficients:
## (Intercept)         gear  
##        5.62         3.92
```
# Regression on carb

```r
lm(mpg ~ carb, data = mtcars)
```

```
## 
## Call:
## lm(formula = mpg ~ carb, data = mtcars)
## 
## Coefficients:
## (Intercept)         carb  
##       25.87        -2.06
```
knitr/inst/doc/docco-linear.html0000644000175100001440000023361413142526154016402 0ustar hornikusers R Markdown with the Docco Linear Style

R Markdown with the Docco Linear Style

This is an example of Markdown vignettes using the Docco style.

Docco

To use the Docco style for Markdown vignettes in an R package, you need to

  • add *.Rmd files under the vignettes directory
  • add Suggests: knitr and VignetteBuilder: knitr to the DESCRIPTION file
  • specify the vignette engine \VignetteEngine{knitr::docco_linear} in the Rmd files (inside HTML comments)

After building and installing the package, you can view vignettes via

browseVignettes(package = 'Your_Package')

Examples

Below are some code chunks as examples.

cat("_hello_ **markdown**!", "\n")

hello markdown!

Normally you do not need any chunk options.

1 + 1
## [1] 2
10:1
##  [1] 10  9  8  7  6  5  4  3  2  1
rnorm(5)^2
## [1] 2.36677 0.01204 0.26160 0.04578 0.03464
strsplit("hello, markdown vignettes", "")
## [[1]]
##  [1] "h" "e" "l" "l" "o" "," " " "m" "a" "r" "k" "d" "o" "w" "n" " " "v"
## [18] "i" "g" "n" "e" "t" "t" "e" "s"

Feel free to draw beautiful plots and write math \(P(X>x)=\alpha/2\).

n = 300
set.seed(123)
par(mar = c(4, 4, 0.1, 0.1))
plot(rnorm(n), rnorm(n), pch = 21, cex = 5 * runif(n), col = "white", bg = "gray")

plot of chunk unnamed-chunk-2

How does it work

The markdown package (>= v0.6.2) supports custom HTML templates, and the docco engine in knitr uses a custom template to compile Markdown to HTML:

knit2html(..., markdown.HTML.template = system.file("misc", "docco-template.html", 
    package = "knitr"))

That is it.

h
knitr/inst/doc/docco-classic.Rmd0000644000175100001440000000111313142522202016300 0ustar hornikusers # R Markdown with the Docco Classic Style ```{r setup, echo=FALSE, results='asis'} x = readLines('docco-linear.Rmd')[-(1:7)] x = gsub('linear', 'classic', x) i = grep('^knit2html[(][.]{3}', x) x[i - 1] = '```{r}' x[i] = 'head(knitr::rocco, 5)' library(knitr) cat(knit_child(text = x, quiet = TRUE), sep = '\n') ``` You probably have noticed that you can adjust the widths of the two columns using your cursor. What is more, press `T` on your keyboard, and see what happens. knitr/inst/doc/knitr-markdown.R0000644000175100001440000000160213142526153016234 0ustar hornikusers## ----setup, include=FALSE------------------------------------------------ library(knitr) ## ----eval=FALSE---------------------------------------------------------- # help(package = 'YourPackage', help_type = 'html') # # or see a standalone list of vignettes # browseVignettes('YourPackage') ## ----hello, results='asis'----------------------------------------------- if (TRUE) cat('_hello_ **markdown**!', '\n') ## ----test, collapse=TRUE------------------------------------------------- 1+1 10:1 rnorm(5)^2 strsplit('hello, markdown vignettes', '') ## ------------------------------------------------------------------------ n=300; set.seed(123) par(mar=c(4,4,.1,.1)) plot(rnorm(n), rnorm(n), pch=21, cex=5*runif(n), col='white', bg='gray') ## ----css, eval=FALSE----------------------------------------------------- # options(markdown.HTML.stylesheet = 'path/to/a/custom/style.css') knitr/inst/doc/knitr-markdown.Rmd0000644000175100001440000000363413142522202016553 0ustar hornikusers ```{r setup, include=FALSE} library(knitr) ``` This is an example of Markdown vignettes in R. Before R 3.0.0, only Sweave/PDF vignettes were supported in R. Markdown is gaining popularity over the years due to its simplicity, and R 3.0.0 starts to support package vignettes written in R Markdown. > Please note this example is for [R Markdown v1](http://rmarkdown.rstudio.com/authoring_migrating_from_v1.html) only. If you use [R Markdown v2](http://rmarkdown.rstudio.com/), you should use the vignette engine `knitr::rmarkdown` instead of `knitr::knitr`. ## Package vignettes To enable Markdown vignettes in an R package, you need to - add `*.Rmd` files under the `vignettes` directory - add `VignetteBuilder: knitr` to the `DESCRIPTION` file - specify the vignette engine `\VignetteEngine{knitr::knitr}` in the `Rmd` files (inside HTML comments) ## View vignettes And R will load the **knitr** package to build these vignettes to HTML files, and you can see them when you open the HTML help: ```{r eval=FALSE} help(package = 'YourPackage', help_type = 'html') # or see a standalone list of vignettes browseVignettes('YourPackage') ``` ## Examples Below are some code chunks as examples. ```{r hello, results='asis'} if (TRUE) cat('_hello_ **markdown**!', '\n') ``` Normally you do not need any chunk options. ```{r test, collapse=TRUE} 1+1 10:1 rnorm(5)^2 strsplit('hello, markdown vignettes', '') ``` Feel free to draw beautiful plots and write math $P(X>x)=\alpha/2$. ```{r} n=300; set.seed(123) par(mar=c(4,4,.1,.1)) plot(rnorm(n), rnorm(n), pch=21, cex=5*runif(n), col='white', bg='gray') ``` You can use your own CSS file instead of the built-in style in the **markdown** package -- just set the option `markdown.HTML.stylesheet`, e.g. ```{r css, eval=FALSE} options(markdown.HTML.stylesheet = 'path/to/a/custom/style.css') ``` knitr/inst/doc/knitr-html.R0000644000175100001440000000107513142526153015362 0ustar hornikusers## ----setup, include=FALSE------------------------------------------------ library(knitr) # to base64 encode images opts_knit$set(upload.fun = image_uri) ## ----cars-demo----------------------------------------------------------- summary(cars) fit=lm(dist~speed, data=cars) summary(fit) ## ----cars-plot, fig.width=7, fig.height=6, fig.align='center'------------ par(mar=c(4,4,.1,.1)) plot(cars, pch=19) ## ----setup, eval=FALSE--------------------------------------------------- # library(knitr) # # to base64 encode images # opts_knit$set(upload.fun = image_uri) knitr/inst/doc/knit_print.Rmd0000644000175100001440000002276313142522202015771 0ustar hornikusers--- title: "Custom Print Methods" author: "Yihui Xie" date: '`r Sys.Date()`' vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Custom Print Methods} output: knitr:::html_vignette: toc: yes --- Before **knitr** v1.6, printing objects in R code chunks basically emulates the R console. For example, a data frame is printed like this^[Note R prints an object without an explicit `print()` call when it is _visible_; see `?invisible`]: ```{r normal-print, comment=''} head(mtcars) ``` The text representation of the data frame above may look very familiar with most R users, but for reporting purposes, it may not be satisfactory -- often times we want to see a table representation instead. That is the problem that the chunk option `render` and the S3 generic function `knit_print()` try to solve. ## Customize Printing After we evaluate each R expression in a code chunk, there is an object returned. For example, `1 + 1` returns `2`. This object is passed to the chunk option `render`, which is a function with two arguments, `x` and `options`, or `x` and `...`. The default value for the `render` option is `knit_print`, an S3 function in **knitr**: ```{r} library(knitr) knit_print # an S3 generic function methods(knit_print) getS3method('knit_print', 'default') # the default method normal_print ``` As we can see, `knit_print()` has a `default` method, which is basically `print()` or `show()`, depending on whether the object is an S4 object. This means it does nothing special when printing R objects: ```{r collapse=TRUE} knit_print(1:10) knit_print(head(mtcars)) ``` S3 generic functions are extensible in the sense that we can define custom methods for them. A method `knit_print.foo()` will be applied to the object that has the class `foo`. Here is quick example of how we can print data frames as tables: ```{r} library(knitr) # define a method for objects of the class data.frame knit_print.data.frame = function(x, ...) { res = paste(c('', '', kable(x)), collapse = '\n') asis_output(res) } ``` We expect the print method to return a character vector, or an object that can be coerced into a character vector. In the example above, the `kable()` function returns a character vector, which we pass to the `asis_output()` function so that later **knitr** knows that this result needs no special treatment (just write it as is), otherwise it depends on the chunk option `results` (`= 'asis'` / `'markup'` / `'hide'`) how a normal character vector should be written. The function `asis_output()` has the same effect as `results = 'asis'`, but saves us the effort to provide this chunk option explicitly. Now we check how the printing behavior is changed. We print a number, a character vector, a list, a data frame, and write a character value using `cat()` in the chunk below: ```{r knit-print} 1 + 1 head(letters) list(a = 1, b = 9:4) head(mtcars) cat('This is cool.') ``` We see all objects except the data frame were printed "normally"^[The two hashes `##` were from the chunk option `comment`; you can turn them off by `comment = ''`.]. The data frame was printed as a real table. Note you do not have to use `kable()` to create tables -- there are many other options such as **xtable**. Just make sure the print method returns a character string. In the future, I may provide a companion package with **knitr** that includes appropriate printing methods so that users only need to load this package to get attractive printed results. A major factor to consider when defining a printing method is the output format. For example, the table syntax can be entirely different when the output is LaTeX vs when it is Markdown. It is strongly recommended that your S3 method has a `...` argument, so that your method can safely ignore arguments that are passed to `knit_print()` but not defined in your method. At the moment, a `knit_print()` method can have two optional arguments: - the `options` argument takes a list of the current chunk options; - the `inline` argument indicates if the method is called in code chunks or inline R code; Depending on your application, you may optionally use these arguments. Here are some examples: ```{r eval=FALSE, tidy=FALSE} knit_print.classA = function(x, ...) { # ignore options and inline } knit_print.classB = function(x, options, ...) { # use the chunk option out.height asis_output(paste( '', )) } knit_print.classC = function(x, inline = FALSE, ...) { # different output according to inline=TRUE/FALSE if (inline) { 'inline output for classC' } else { 'chunk output for classC' } } knit_print.classD = function(x, options, inline = FALSE, ...) { # use both options and inline } ``` ## A Low-level Explanation You can skip this section if you do not care about the low-level implementation details. ### The `render` option As mentioned before, the chunk option `render` is a function that defaults to `knit_print()`. We can certainly use other render functions. For example, we create a dummy function that always says "I do not know what to print" no matter what objects it receives: ```{r} dummy_print = function(x, ...) { cat("I do not know what to print!") # this function implicitly returns an invisible NULL } ``` Now we use the chunk option `render = dummy_print`: ```{r knit-print, render=dummy_print, collapse=TRUE} ``` Note the `render` function is only applied to visible objects. There are cases in which the objects returned are invisible, e.g. those wrapped in `invisible()`. ```{r} 1 + 1 invisible(1 + 1) invisible(head(mtcars)) x = 1:10 # invisibly returns 1:10 ``` ### Metadata The print function can have a side effect of passing "metadata" about objects to **knitr**, and **knitr** will collect this information as it prints objects. The motivation of collecting metadata is to store external dependencies of the objects to be printed. Normally we print an object only to obtain a text representation, but there are cases that can be more complicated. For example, a [**ggvis** ](http://ggvis.rstudio.com/) graph requires external JavaScript and CSS dependencies such as `ggvis.js`. The graph itself is basically a fragment of JavaScript code, which will not work unless the required libraries are loaded (in the HTML header). Therefore we need to collect the dependencies of an object beside printing the object itself. One way to specify the dependencies is through the `meta` argument of `asis_output()`. Here is a pseudo example: ```{r eval=FALSE, tidy=FALSE} # pseudo code knit_print.ggvis = function(x, ...) { res = ggvis::print_this_object(x) knitr::asis_output(res, meta = list( ggvis = list( version = '0.1.0', js = system.file('www', 'js', 'ggvis.js', package = 'ggvis'), css = system.file('www', 'www', 'ggvis.css', package = 'ggvis') ) )) } ``` Then when **knitr** prints a **ggvis** object, the `meta` information will be collected and stored. After knitting is done, we can obtain a list of all the dependencies via `knit_meta()`. It is very likely that there are duplicate entries in the list, and it is up to the package authors to clean them up, and process the metadata list in their own way (e.g. write the dependencies into the HTML header). We give a few more quick and dirty examples below to see how `knit_meta()` works. Now we define a print method for `foo` objects: ```{r tidy=FALSE} library(knitr) knit_print.foo = function(x, ...) { res = paste('**This is a `foo` object**:', x) asis_output(res, meta = list( js = system.file('www', 'shared', 'shiny.js', package = 'shiny'), css = system.file('www', 'shared', 'shiny.css', package = 'shiny') )) } ``` See what happens when we print `foo` objects: ```{r} new_foo = function(x) structure(x, class = 'foo') new_foo('hello') ``` Check the metadata now: ```{r} str(knit_meta(clean = FALSE)) ``` Another `foo` object: ```{r} new_foo('world') ``` Similarly for `bar` objects: ```{r} knit_print.bar = function(x, ...) { asis_output(x, meta = list(head = '')) } new_bar = function(x) structure(x, class = 'bar') new_bar('**hello** world!') new_bar('hello **world**!') ``` The final version of the metadata, and clean it up: ```{r} str(knit_meta()) str(knit_meta()) # empty now, because clean = TRUE by default ``` ### For package authors If you are implementing a custom print method in your own package, here are two hints: 1. `knit_print()` is an S3 generic function in **knitr**, so in theory you need to import it in your namespace via `importFrom(knitr, knit_print)`, but due to the "lack of rigor" of the S3 system, you can choose not to import **knitr**, and just do `export(knit_print.foo)` in the namespace, then R will find the S3 "method" after your package is attached via `library()`, because it is essentially a normal R function; 1. `asis_output()` is simply a function that marks an object with the class `knit_asis`, and you do not have to import this function to your package, either -- just let your print method return `structure(x, class = 'knit_asis')`, and if there are additional metadata, just put it in the `knit_meta` attribute; here is the source code of this function: ```{r} knitr::asis_output ``` If you are worried about possible future changes in `asis_output()`, you can put **knitr** in the `Suggests` field in DESCRIPTION, and use `knitr::asis_output()`, so that you can avoid the "hard" dependency on **knitr**. ```{r clean-up, include=FALSE} # R compiles all vignettes in the same session, which can be bad rm(list = ls(all = TRUE)) ``` knitr/inst/doc/knitr-refcard.Rmd0000644000175100001440000000322013142522202016326 0ustar hornikusers--- output: pdf_document: highlight: null number_sections: yes template: assets/template-refcard.tex --- # Chunk Options `opts_chunk` controls global chunk options, e.g. `opts_chunk$set(tidy = FALSE)`, which can be overridden by local chunk options. See all options at ; some frequently used options: eval : whether to evaluate the chunk echo : whether to echo source code results : `'markup'`, `'asis'`, `'hold'`, `'hide'` tidy : whether to reformat R code cache : whether to cache results fig.width, fig.height, out.width, out.height : device and output size of figures include : whether to include the chunk results in output child : filenames of child documents engine : language name (R, python, ...) # Functions `knit()` : the main function in this package; knit input document and write output `purl()` : extract R code from an input document `spin()` : spin goat's hair (an R script with roxygen comments) into wool (a literate programming document to be passed to `knit()`) `stitch()` : insert an R script into a template and compile the document `knit_hooks$set()` : set or reset chunk and output [hooks](https://yihui.name/knitr/hooks/) # Resources - homepage: - development repository: ([CRAN](http://cran.rstudio.com/package=knitr), - examples: - stackoverflow: - mailing list: knitr/inst/doc/knit_expand.Rmd0000644000175100001440000000333413142522202016105 0ustar hornikusers # Demos of `knit_expand()` A few simple examples: ```{r} library(knitr) knit_expand(text = 'The value of pi is {{pi}}.') knit_expand(text = 'The value of a is {{a}}, so a + 1 is {{a+1}}.', a = rnorm(1)) knit_expand(text = 'The area of a circle with radius {{r}} is {{pi*r^2}}', r = 5) ``` Any number of variables: ```{r} knit_expand(text = 'a is {{a}} and b is {{b}}, with my own pi being {{pi}} instead of {{base::pi}}', a=1, b=2, pi=3) ``` Custom delimiter `<% %>`: ```{r} knit_expand(text = 'I do not like curly braces, so use % with <> instead: a is <% a %>.', a = 8, delim = c("<%", "%>")) ``` The pyexpander delimiter: ```{r} knit_expand(text = 'hello $(LETTERS[24]) and $(pi)!', delim = c("$(", ")")) ``` Arbitrary R code: ```{r} knit_expand(text = 'you cannot see the value of x {{x=rnorm(1)}}but it is indeed created: x = {{x}}') res = knit_expand(text = c(' x | x^2', '{{x=1:5;paste(sprintf("%2d | %3d", x, x^2), collapse = "\n")}}')) cat(res) ``` The m4 example: ```{r} res = knit_expand(text = c('{{i=0;h2=function(x){i<<-i+1;sprintf("

%d. %s

", i, x)} }}', '{{h2("First Section")}}', '{{h2("Second Section")}}', '{{h2("Conclusion")}}', '')) cat(res) ``` Build regression models based on a template; loop through all variables in `mtcars`: ```{r results='hide'} src = lapply(names(mtcars)[-1], function(i) { knit_expand(text=c("# Regression on {{i}}", '```{r lm-{{i}}}', 'lm(mpg~{{i}}, data=mtcars)', '```')) }) # knit the source res = knit_child(text = unlist(src)) res = paste('
', gsub('^\\s*|\\s*$', '', res), '
', sep = '') ``` `r res` knitr/inst/doc/docco-linear.Rmd0000644000175100001440000000267313142522202016145 0ustar hornikusers # R Markdown with the Docco Linear Style This is an example of Markdown vignettes using the [Docco style](http://jashkenas.github.io/docco/). ## Docco To use the Docco style for Markdown vignettes in an R package, you need to - add `*.Rmd` files under the `vignettes` directory - add `Suggests: knitr` and `VignetteBuilder: knitr` to the `DESCRIPTION` file - specify the vignette engine `\VignetteEngine{knitr::docco_linear}` in the `Rmd` files (inside HTML comments) After building and installing the package, you can view vignettes via ```r browseVignettes(package = 'Your_Package') ``` ## Examples Below are some code chunks as examples. ```{r hello, results='asis'} cat('_hello_ **markdown**!', '\n') ``` Normally you do not need any chunk options. ```{r} 1+1 10:1 rnorm(5)^2 strsplit('hello, markdown vignettes', '') ``` Feel free to draw beautiful plots and write math $P(X>x)=\alpha/2$. ```{r} n=300; set.seed(123) par(mar=c(4,4,.1,.1)) plot(rnorm(n), rnorm(n), pch=21, cex=5*runif(n), col='white', bg='gray') ``` ## How does it work The **markdown** package (>= v0.6.2) supports custom HTML templates, and the `docco` engine in **knitr** uses a custom template to compile Markdown to HTML: ```{r header, eval=FALSE} knit2html(..., markdown.HTML.template = system.file('misc', 'docco-template.html', package='knitr')) ``` That is it. knitr/inst/doc/knit_expand.R0000644000175100001440000000537113142526153015600 0ustar hornikusers## ------------------------------------------------------------------------ library(knitr) knit_expand(text = 'The value of pi is {{pi}}.') knit_expand(text = 'The value of a is {{a}}, so a + 1 is {{a+1}}.', a = rnorm(1)) knit_expand(text = 'The area of a circle with radius {{r}} is {{pi*r^2}}', r = 5) ## ------------------------------------------------------------------------ knit_expand(text = 'a is {{a}} and b is {{b}}, with my own pi being {{pi}} instead of {{base::pi}}', a=1, b=2, pi=3) ## ------------------------------------------------------------------------ knit_expand(text = 'I do not like curly braces, so use % with <> instead: a is <% a %>.', a = 8, delim = c("<%", "%>")) ## ------------------------------------------------------------------------ knit_expand(text = 'hello $(LETTERS[24]) and $(pi)!', delim = c("$(", ")")) ## ------------------------------------------------------------------------ knit_expand(text = 'you cannot see the value of x {{x=rnorm(1)}}but it is indeed created: x = {{x}}') res = knit_expand(text = c(' x | x^2', '{{x=1:5;paste(sprintf("%2d | %3d", x, x^2), collapse = "\n")}}')) cat(res) ## ------------------------------------------------------------------------ res = knit_expand(text = c('{{i=0;h2=function(x){i<<-i+1;sprintf("

%d. %s

", i, x)} }}', '{{h2("First Section")}}', '{{h2("Second Section")}}', '{{h2("Conclusion")}}', '')) cat(res) ## ----lm-cyl-------------------------------------------------------------- lm(mpg~cyl, data=mtcars) ## ----lm-disp------------------------------------------------------------- lm(mpg~disp, data=mtcars) ## ----lm-hp--------------------------------------------------------------- lm(mpg~hp, data=mtcars) ## ----lm-drat------------------------------------------------------------- lm(mpg~drat, data=mtcars) ## ----lm-wt--------------------------------------------------------------- lm(mpg~wt, data=mtcars) ## ----lm-qsec------------------------------------------------------------- lm(mpg~qsec, data=mtcars) ## ----lm-vs--------------------------------------------------------------- lm(mpg~vs, data=mtcars) ## ----lm-am--------------------------------------------------------------- lm(mpg~am, data=mtcars) ## ----lm-gear------------------------------------------------------------- lm(mpg~gear, data=mtcars) ## ----lm-carb------------------------------------------------------------- lm(mpg~carb, data=mtcars) ## ----results='hide'------------------------------------------------------ src = lapply(names(mtcars)[-1], function(i) { knit_expand(text=c("# Regression on {{i}}", '```{r lm-{{i}}}', 'lm(mpg~{{i}}, data=mtcars)', '```')) }) # knit the source res = knit_child(text = unlist(src)) res = paste('
', gsub('^\\s*|\\s*$', '', res), '
', sep = '') knitr/inst/doc/knitr-refcard.pdf0000644000175100001440000053176013142526153016405 0ustar hornikusers%PDF-1.5 %ÐÔÅØ 46 0 obj << /Length 2990 /Filter /FlateDecode >> stream xÚ½[ioÛHýî_¡A6•DmöÁ+ë¹1Lv±²˜ÅdÐT["L‘’²ìùïS}bËMÙÖƒ|°D6«^W½ºšÊÛ³£ãØáì±ÑÙňŒŸŒ<ßE8ŠFg³ÑïÎežÖåxB1u¦ü‚— ='»®sz“)vêøZ6µ¦y–æÜâ\ L‡Ù.e ïl·X׫uÝÏ*JPDØ0¬"r=ªôNó1 M?­dûÝ0¥Zuõžœ<}õêå^  ·åUWñë=¬@g˪®ÎϘ²S~½*¿_ÿØÃ­ÃÔÛ¹ÕU&£7 …BR%:«}è\ï\þ­Ÿ…€ÐÛðþ,Ärº¯Y¸œõ3¶ÌÜðÁ^avu~ýúU¥“3 ÌD¹æ;”)xÎÓ{˜:¾–©€=\@kËUC«Å(à7hl¢Mr­×±]ã…ͯ{¨~z;Õ»è?½ï'/È#n4 y]‚(Õñ2]ˆZ/ÇØÉzYL£’G»ÊO~šLÎù<ÍQ™3.|ܧýlGËÖ.¨× ÂdòªŸ¶C¨oi»k‡RWoÅO+ކ€â°°‹ãç³O¿öRÄCOI¡ 6D¡î¦eÕßÒ0€¡CPÏPвô}’äÚYAÀß~Ò  ¼!¡üEù¢/ FF´äS¿Y`K¤Æ‚=yôÀYilì¬ä§gý4­,¦¥ŒvDiÓ1‰œš_÷SèDé ݨ¡ø±"уéPZF[°´ùt¯€Ðòº Aô«:™îíX`§_ÀnÇJ­ +½«_ø0 †!ª"â7ýj\%i:+Æ lÒOWŸ¡(ˆ¡kWýññ|KËW˜ûv -a»ž5Mé³=d=L¹¬]åoÞ÷r¡á"¨‚aÚOêù(r#3iÖiÆû™èA“Li? å=:€Š€i©hEs.¢åbÄ놋¯÷pñ0åv.v•ŸCßéãBÃDPÎÈ@](ó<£ÊÏKÞDaز…8ÿ‡ŒÖï–±ÇïÝÝŸ²ï®‹`ÖfM;ãyQój<±ËÉD¦ $ÎÔ÷DLÏr„^ç—êR±ªÓ"¯ž' C0£9Ò=rWXCÜè89Éâsž=× à*Î^~|#ù¯§ôAãBŒ=´…øO‹†Ìî´é·6I­›l&QñyªÞKÈŸaäC?#ÞkèÚ‘(c̸x)Aiw¯~GøØÂÝ‘¢ ÅC„D;G4ø±È"Ð1G–±­y¬•õÙõÜOﺪŽó™Ø!eâu„ºø)./¡§È9,ÆÖw*!lx5iƒê&è—*ŸÒ<]J6ø¾óá:^®20£n¼rG 6 4Ù ’¯e`£§ñV†ƒ·cñáJ}›ÐÀ“🢩|m³ÙÂ3lç çÖ`ÛýΊd½äydqU}Ë:M2Ïe3,P°¶Èú÷½y¬]F(ŠôHõ–gÅF9&­ÔßX•ʦhzN²€@6''EÑ;Y/Ϧÿb¦—ÆrÍ«ojåˆØ&s•µ°O—UcšÝ5¯-;9[h¸dký±¸P{ùfîp{òýíê³TkÓr»ŽÇ!Ì¢çg!„PظŸh÷O•«5)"Î_ÎúCÄ|íøŸSúËRJÚä_~²Äi‹í)²™›»§È;ß 'þЯ-Õ#†qöâmÈ]rØ1âãÛª"†0aÍTß,’LÞ) Ùˆ3ÁÄ…JÉ7Ç$ˆæPÍœ·¢cª0M•s¸˜ Ð7wPÆ¿ÛL«ÔŒ…¦Ah®?~…l¹R‘=ÑÐhwP+ß-D"S…Òœ«BÙãMŒBªIµú"³‹%ßC)k¾®Hò`]™¬ež3ÏŠsU¬Ùíbíu‹µõëìßë-œT\²·Ng7Êlšíß@åÞ:Á,ÝL¼9õiÏUQV¸¾›Eª1O|7€®#WÎeÝåâ‹ïÈêu%~MÀË2A%W×ÏÅ¥õ¹Û¶HI¦%Ä%m ¾">T%®ÅÇYf,P_Ô»ü;QŠÙVúE]¯ªz{ú–±½ãã›t±NQ/ù±ü]Åq±þJ=ÇVÓa Û¶=ª°K®ËzÉÿ\sEìFÝ]W|¦>µÀNsòv„Oé‚{Q c„_}F° !@û6‚7 ^/¸î*êBá‡=aÁu\s}g¡¡š° QÒÔÇQ… ´{‘·ŒRY4F[—‰•“†Ž:oaQÒ ç•¼Zgµ-‹Âœ…m}bÏ}mç)ÊÕzeƒåO`L1¸7…>·ˆð‘»MÂOîJÂqe- „#ü8E6ëÃáÿ8Ò– wÚc'’  D5 #“¤…¹¢¹ö2·äúçCòêT“¶>¬„UB ýI¬Â‡[@P.‰¿„x\ÄŽ“þ†r-Ìì]Êæh“Îê…–Bª¯,x:_Xµ¾\¬ëÎ2&¿‹Eeõ¬m&„nƒDõ*mBF_ÿDGÅ~úMßÕ^Ü•`Ö%·î§ol(Í“l=³Ù¦¤ ØoËæánJiP§9ó"®Ÿc{ÔYÄi©> A±^1U—ª¤™0Ò•øT«Ë›´^¨uâV! _ßÌy®î&År'ð'ï¤êj¡žÝˆ/jçEÖ îfà¸RtQjÜĈ±hÇEe1/ãå2Íç{ÈÀt¢ÛZFS\µmb]ØF€*Zk»»(ot.=³Ì«†ÍlUÕi,öȆá!Ä­ì4¯xYw™ÄšúX%eºªÛ <Ò;õ>ùr•µi#௕8€7sómcZv¤±n¦ú²(ŠËª–z6†Ègm „µ:N˦h/íŽqpW£§F™[h6]VöS=¥ÐHžNS®úã&ýEÆ‚"‘Ø»9ð3Á®õˆ>mÛº%_A{aë»\MfNæt‘%$ È`æÞm8îaEž«6Õè²»R¦«Òº(olˆ±+êÝ…<‡\°>G@¢c@,7 &;Û4'VO»gµï¦oþõܶE„(Úï³G®dm{|½ÿ&0Û»­@JχþÃ{8ȪnjœÌàå˜ZONÛðû yÛø¾uY\ñò"+6(yy\ÇóJOØ6Ürw†Íûà†"žµù6K«ÚÊmâå¶•Ëb½ªÐ¼(æòlZÚ[^ì勈XJ°> Yó¿ô+£¿ ¡® endstream endobj 77 0 obj << /Length1 727 /Length2 17086 /Length3 0 /Length 17663 /Filter /FlateDecode >> stream xÚlzcp®Ý²mlÛycÛ¶mÛΊmÛ¶m;Y±í¬Ø¶³î·÷¾ûÜ:U·ž?ÑÕ£Çìó©šdDâö.ªžŽfLtLôŒÜqaM&FFF#= ™ˆ“™‘‹•ƒ½¨‘‹7@ÃÌ bæ`b0322ÁD=¬,,]”&TÿÔmL­ì¬œê¶nV&–^777A7gWz'W~úŠTÌÌ.–fs+[3€ˆ‚¢–”¼€RB^ afoædd Pt5¶µ2ÈZ™˜Ù;›QÌœ¶ÿq&ö¦VÿâäLÿoönfN.ÿ3wr°ȉ© ‰+È«ÄDTEFö¦YÉÊí]œ¹ÿA›™{ük:Z€ËÿX¶Fÿcÿõ?Y'ÿXô0LLS+€±™…•= ÿt“²7w°ÿ'lêêøßÔ?„œÿá üGC*€©™ù?hW[[y#;3¥ˆƒ£«‹™@ÎÁÔÌÉ ì`k óp1³753ý/ÚÈÎÊÖóÿ‹ÿ¿)£ô²·øGAÆÿ„¬œÅ­<ÌL­\þ‘ÜÜÈö©þ×0ûÏùü«Ñªÿiøç\Mìm=ÿoÆùw;m%išÿYƒ§ÅìML­ì-*.ÿ(jädú?§¬þ³Cÿ¥òß0ý?_ÎÈÅÉÊ ÃHÿ¯%aü×÷_Kïÿ¡„…<¼é˜™¹t,Lì& —ïÿ¢kâêädfïòoÙÿ™å¿þ¿×ÉÌÌÃÌfcÕÁ„'Ä:½-¬ÒO¬x¾ œf~ÖPf• xm¦ïVÙjØÒÔàèçA§À.ИoïjWê¡•Ø(Þ îdj:†(Boç­”¤Ê¯nçC©ð½1BÿLÛÎDì6òÞ%ss#H‘zš5;ï¢NúW9²SŒaE× 8ÒŸ„õ¥'{ *= ”,í8³šZ¤yËТc·ý ð‚à=¸[2lË¢Ê@Ç£píÂÆkk]ß+ý:uùL&o¡ˆÂ÷΀ÞÕô†sufdÙýµ¯y çÏ¥=Mɤ,{‰tv|F}þ»%ʈÕåJ)ô£ÛoúZ;ѵ‡EÐäj=y€¤äv{ŒÔ§åeûÕµ+嘯+7qûjÚ†bLP—æÁºËt¾eY<µ`›Úìxc´ÅŽu×»­+è&§€,†_½ÿr·ÿÈIëb0í|™¦7¦JRúÏ:ää5Š/¬[ˆ^œ@Wà ÒÈu?/ROFáLúúÜsÅ Éo‡ž¬?€ûqsr_i\4ƒ*V¶TùæÃ0 Ýiñø ™6Ýã#ônd_)"Õï•‘6CooJI}P=’®»;Æ X)sK¸G®æ=QœÈ*s¡hßX†¨ø<¸.N=lv#¸û­@ÿǤvˆ ûJWÑ> bw…¹4¨`P[ËÅŒ ×H‘ yÀðp•ˆýwÖÎ57˜w¾Ø3áÒÇkʼnÚEÖÔ4\IÇ@­ $”0Š%C?^A$y¢(·$[0µ'¦q,¡T…6i¾«]ýe#]ÍmAKçuN쪰nwÏ⒇ܛصÍ9v!¯gRÏšR¥ùžx7*$l?2^äáV‰8oÕrŠÎ#3íŠJ8’ûÄà¶Çú¢öñ…ºÉ–“g¾ª`k Ä¯Ï5¶í,ñrìá2áŒñc|fQ2Dåà²L_µ v!âªÄ)ÑåŒ ã¨Gð²s‘­ß ¤BðŒ,«?×ÙºäèÕ´}.¢ß±Fgx2éORd?OuÒåq”l§ß™aG™1›ôÙÊ"ŒŽ@¿òÏ÷˜k¾ÉH@À ”c_|CÒÂ"Xüo”±—~—J=Ý2r_œðr#$‹üuÛ>—Þjô^O®?a²F1äO=Mo”0LS:ŠQ`bÇãRÃrc9ØÀŸ- CL“Ú—òùN~5†b' wŒUî–ÃcþײKÏ@©Påòþè«%ep#šôk]yñ3ކ9ÅdšÄ }«öYŒb5mXó‹x”’¸1åL¹kýgéÄ©Â݇pQáûq"äxê‚f ÅŸÚŽ¾36m­i}¥z ¥¨yHu¼Kï”/‡˜#ˆz²]è·/“ÆîP è $÷úYÌ­õÑ·Ð d} 4}*Û¸­ž1ã‡>W|¥ö¤A9”6%e£q=iHîx*Ë\Ó ÿ¨½Y–$ ‘I,÷Ç@o…á‰î¹Xaý…^XIöÊÞNa¢[3>þrÖÚd†Õª$Ø?êšëVÈÄKÑ#·XÕÅÔn‡:Ô~“¶È–ÎuQä‰QðãŸÖa-ÜX1?¥ß7޹Ο"•Ýp›€JsrŠÍMð §,8‘–K1c«ú¤ðha’XÝ*º_dšòKw¤_'ôïØñ »›ŸZLÅŲóÞv³Ø_PGc8ðÄîùpf šà±Gj¨O¶¤‘0™«õz•<ÛUß1kŠ0Í8— §ŸŸl»ÖÝ1„¿(~ço­Ë˜6LQdE5g ‘ôCiNHD«|P¤ *å°«ÙñŸBÓ'Š,c—¾¶ WÑ"¥”)ÃÒÖ]½@þ m5à`ÙÐi-˜×–\Э]‰Œðþ°?v^×»lBôÚë¼=þm¥ªcŽ>${n½óó¥üüK^]†Kæ—{µ—ˆ(’c»Ï+6/VeœQZ _eI¦_sÙBI*¢ï¡Í^¯Çé,þÓt xîTío†Íè¬2pèX~xÖ©Xç»9QlŽJ}#ˆK3ÎÂãmÅSñÍÏÞ¸¶oçÆ`ÚMš$p¼ÒôFÀª] u›Qv… -Aéü]šIväôB’d¢Ý®ØE:”$ÓtoÓÃß\ûHS0 ýRßmÅ\äÎÌÚ–Ž)FÄ“ëY“ÕZÀ†Ù‚AàTx´Ö0'ÒÚ¤ö‹^W§vùŒØD¬‘A¼ÏM)eckï.©ºÁ|ÌSë¡k«.>’Œ‹'¦êaG݇iö\lceêwbѱÍz¯S‘é©@›Ïéñ£çxˆ`øµ(1Æí! ¸ÜÄ#ýÏdÛñ H µ*l€uw‘%€)6Þêd U‘“(&áðWLŽàÔC¼þN1*ݺàUrð÷±-– „á P±çRÂé“cŸzŽ¿;ùpæh=ÓÔP¹zŽßsÊ03½‚2)…Ä$ÄÀÃbŠœ²ÅÆßÁ D>¾ø3 ðÁ b$ê“°ødÉ}OU<ò%ŸÌXTÙ˜.67~PºX¬M« ]ù«‘€µè²æ\ïnþ%wlX0Ñd?¼i›>a6qŠ£ƒy,¥ÍzJ½—ÖŠFòîJu ·H~—2"ìú®åÖRT™¬ÿk UÈ@ Õ=’%¯ ÿžÉÒƒ´F…§»9xRRÇÈÁ˜42Ù¯¸Ø}Ô~é †/zùŽ\`o¦ÇŸ‰º?]·Ü8˦¦Ãéåþiôš°á9e'ëÖŽpÃ;s–iæZQZá2tÜ|áãï¯òFÓ²\9R 5íëÔ‹ÕÆhQéú)|Mˆ2! ‹AsNEþÅ{s;N“L y¼"°ÂØ;³p oÎk”HLw³Û¡7Úß_%ùRlyUÕ&,x8c7›4åQÂ#ì YQQŠ94¾ó †Âº²w¦Y=,·Ãþe‘ûdÀâHUoDó©,kµRc®F!LyŽ<èüÏ…l£#ÃÁ~;2‚ÆÉâH’UsîxY ôõ›êÙiõ> {Mçé„èzj·/í w!Y¡pÎq0«Agås†RM㟠ˆæ?”c3¯[¤"—܈>L¾´9"géëöv¸‰Ðy,ø'‘ÇPÑ ‰V]¡weÏÙÐa£HÐKã8P}ÓS3ñâQêºvzÏÁ¢MâUz‹¿ š`j³,ƒbh[üfº£ÄÃÛôö[щMƒù•ç²'1‹V Ö¡ÿŠ#C,Å‹5ìQŒÇ§žNú\}gë·ç)|9¡íÑÄù`ûé¦â¹ñQ_>‚cÀHÄÅúÎ %­9ÕÌàw°I†ìï®vè¨P€x×M#& `Þ”é=ýôd_¸-EÀ͹Hš`ŠüÑE]…(U¬(ÀVüoÕ§!Ë„byNE¨\h¯8±ì¦ìI3àÃìÅËI}ÆÀT0žv Pƒ:€¢èS ’í¢S§l|çtØåkgS½Ð÷‡L>¿Þ‡b³X>ÅY~Z­¶5J«’š‰pá:&x J]à—Œ¼—bøú»3Ùd–b·1Ç©ZXੲ4óõ©¶a[è»”xfÚmdW¯}¢3ô<V°\ÆÞ„Çp·¯•tsïQˆÇaQ©ÎI"“©;Ä™%îO‹y2O£kÄñÿÊY`±íÜŠõ>}’á¦ÀŽ© ¨\*Ù‚l©>ivàç²€ã☃}^i¢E$97‚›×¬¢¹üöº°’öª‡he§4°-ë P‡ËsÙmVu½Ë ó-ˆÀAì«ÒËå?,ϼrñ‹`5s™&Y"ñ~(öpé3î`¹ÃƒÀŒÎ²LÈöiÔïæÓÿí=Â]Ê=ý‹Ûˆþݰò~-rc¼·UIdªíäˆù¯‹œ+ˆøÂ»!ó’>²8SµÎR>›q¾Á÷ƒf´O¹<øƒŠŽËKÔÍgRr<¢±<Œzîyèud¡kG´tG@à‰M‰S&ÎÅ!TФÐé!ó‚Ĉ®Lá»R‹¼ed{ñÙt'çò@]ƒŒRˆÕDs€Z7¥TñÌæÌ¡'p—ÜÓúÇY²q挙%¶O#‚ö¥†/ÓÞÈÁòwV„NÆÛ/ CòÎO):ƒÛÑ‹:Ó#»¤ãD ï‚ü4Ú ‚¢ ú—÷8 ©à7ú¡!!§ðMy/³Žœµ1"XUú?Ÿú~d"cX“^=Çg3Ó8Y®XUZü+ä±×||@1E*wH«4ÏL·T£Æ™x9¡úºæd¾÷VZåêHºf`5¯—To˽á0]íÕ1@ä©î“ôΞۊ½¤©'ø¶Ä"$5w[`®1r¢U‰ö·­—Ùµz¥¯î–d!—’|ö³4-ÒÏ_ §Ý2÷î.¤ni‡µ²óßÛY¬ÆÎÌø#5——3£vg÷§ŒîqbŽ¥MØü5SõÉC!ý!lÔÄ„'áØ’óňOŧê…i•pÏ€_V_3Ê Çy3%DE;…¢žµÈ-ë„ñWœM˜hSŒß2mÁ~.šM#•±û )íRËöOrU²P~š}Üs‰]nKá^OÇ… %Tí)ìqʆ~À´•a¬›c—ªF•^sð¡Ë/ÏoÕ½T½{l–boÍFÕúP®‘dÇÍœ¬‹§O© ïš¾ 0…r²¦îí-ÅÈ.Nõü¡~:ìÓ?AõÜ*rF0ŽêUèñÞ$…wÇ8Å£BåQî‰/ét#B¡Ô,ý/gâ#ß{qÑ.„ζ ¬½uº;HaE¢-zâlwXwµJF£‡àwK-/^`ÝÛƒïiWè•ÉCw¸Ó3;áýå|KÏ|ÇPuw‘…•¬„!W’í]Wn³Ì ‚3™|(a_ógLšüðËUÖ{«1ÇÊX²‡Ÿ±$û÷ºœ†\[¡ªc‚#$Á£É¶þ2ÏjªC!6Kœ­žä¨N5/ùx³È¿¼ ¢ vVñçÝ%°‰vE@Þå}mƒÕaú%>d Ôw|+‰æ£|o5£âåBÙ–âCb©›Ÿ&µ\ƒaJ©#Ô%J…ñG¾ï| XÀ6Í+NMìõt÷ŒÇ‹##P\€‡=åoàêœæ 5ÂǾušƒ¼½Ìj!ÄJô‰µÎ,aÉí'òkè±4ȧnUÎe%ÓÕÁ‹s“ñ¦yÏD•rŸ^´T¥Š5Žž)ùšÿ.á´É“õÕa¼ºQm ¼3ºœâ3Ý0uüKT88!@5ü4¤-Y¬üî‹FSEç3]h5!æ¯@|TG¢ÿº$þ‡xëuj¤õÆ•™DŸ(¨Þ9nçmW“ýuð×§»tì¯?Vú@,Äá¦Üû‘›õƒ_}3u'% ¨•\£«›ÜÀ‡Ø¦œÂìî`žÝ·f1 ¾ç"e|–'¬¶Ð_!‰ƒ*6ZÒ»ˆÅn%ù¤¾*ñ¥ô~&-El%)eÅkŒZzuê’ô'…`—–u€åÁé!·Ð¡èn‹o¹j¶ù¯<ãÛãN®ˆ&s/DB.@Éjw‹ŠØ5ذj˜ù Øo llŠÚ²G þPqƒä%ð3%½N‡Îã©_‰R5¦Ò¹B§º£Œ#!X,‹­V¦ÜÖ›ª.Äíjæ:­åÅËGX4ñ×à RƒdIÓé¯ý,Â|o{‚ïÈ¿"Âüu¦›ò.—§)Æáé"žaygäf _䛀ƒ¯Èçg[ÓgPÚ=˜Óï£:âP^æCÜÂ't%CHâò³]á>Ì“ eª±aUÔ _5ß^~z•Ñ|´eÊeUFSLäÐzëy;zN®ŠP@áÓÂxÑü;ƒÃ+š‹¨|éɩϮwâð⨖VNý fýòG¹(YHiSkÞs"Y*š7¥AŠÀç*©j§Ì=ÖœdPì²@4NòõöÛmnÇ~¦ò”ï`´›v%²%ž¼[h½tÄnÃq_–Ír“,$TIL­>XÒšuöÈÓA‡'ucBg-œÖŸ‡Låfÿ78lxù“äZ OŒÊk’š ÜWº“¼‹^9厧 L®Ž=Á«EŠ™ñš•öŸœóH×{÷v%\æ¼y³»} ªÊ’(u'^TÖœ0‚×ë=ûs}R°×R×wªÄn{²c<+TCù¹ô´3¦ûþÑ\œÎä!Ú Ó˜×Ë´!ù&•8ò‘²¶:ƒÇbK'´-$\}Ú“¥ª«ˆ§+@’†–øÄŽ<­/ìùÊ=ÁnyÙÇQG¶Œ5súìcFà:þèwcV)0 &¾#¹ÇÀu>âŽæ+ A^¨ 'Ρׄ7¼Ð}m×£®$9ù«Üû%OãM•ÀW=ê—>ä$¼{%fÂl·ÐÙÚ37/äósªèºdå™\\dƒm?Ñ98uHþx9(Ö&5Ü÷Фº¡Ò—r{Õar)½¥½õû)ÍTN›pîç’— ï2þïó.m‡Ö·y‡¥)±˜”žòuúΙãuê²^æÒRõ  Áe zCØÕøleMyVf,Q *RU­ÈáHº%¤4=n bK×tÁlJ°ã¯}l«>ÝñL€iø27.õ]Æœ¬¶) ¹}+C-AÏQ\ª¯ÿ¨u¾íO³¢®µsñ/ƒŠic¼(ÃZo)K¯_ž,AÃ%…òq——;¦©Hh’Þ‡òyÏØŸœj†u&ÎÍ¿{¢Éð§µÖÀ Ö¹nr_ÏTs t>lä>€žfÒˆ(ª"§zYºÀ [žÎ6WÑÔžy.Â0%E- tH­ì»Ò­µÚ¼Ñ-Ïøï¥‰•?f)P5E¦%QyðÐŽrxS 2Ž#Xh¦ˆ;héÌH…Öh0$ÜÞ‹z¸‡4Äy I—&VÖÝ= ˆàføð9»^‹¸ª@2XC’OÔÆ«:é0ò:£“æ_9/%ÊuˆÀ˜Þ×kŒ){Àɪb)އX,€€Fº¹Y„Ð šÍ¤öô¹1{PR£äš&ï:Ì̆˜zÈï 6vwÁŸ?BÄ-ßï…vgÖ 3RÛ³n§Qo”Í,(z±ã¾¾º( @6ÿ ©<›uËo·¸$Ö¹¨e¾ÊŽs³€¥ógé4çÀ¼§Ò8M€µFøÂ6jÉc{ááw07‹2ݰÛàŠ r¾8}½Qµq.lv²8›£Œ¤héßZaÝêx91¡Þî\YCâÝ¢¯õc*TGwûDûŽ Ž,0ÆæV‡ +˜ø7…+ B aÎ¥PŒÃ°µrj–écb‚!XÅxÃst›õ^Ò ®ÀXcGŸþÒâÐÎòGý%;VÎíö±„eÛúY5·j¡©51lfÈ嵄ߗpt¤l„BYq"ŸÇéÔH|óuôMVt¥V×:†íÛxò$ž¢ï˯syÝíp8ù=ÛðNõ‹1á;ô:x Õ[pvL,òÇ«ëqãÞvȺÝ+Ù& J ËùöK j†PzxÄE“x‰65ËxrNÿ%ªÜ‹¨Hr}µ¾ýÝìœjÀîX*R'2¾šêql•£I‡¾¦Te„x¯ÝMuªm²Ä`.ŠLŽŸ1ò¹'CeÓ|6ó0)Šs[{•6ÝÙ•FêáÇS+ó£I¡Ù3víˆÍìƒÑYã^eÝ›Ð0ŒÂÞ®4ÿÓ¤Š+lþ¦­B“þÕ G©ú›v<†c¶©‘„³¶ë.mS~åj»oÜTýéðÆÙn‰Ê']·”©t9ú7 1½²¦Æ6¿ÏèëPE‘ê óEÞ¡4 @mkxR… ý¾£Ëô®JNÝAW…LEçÓ]9³¿NcÍF"`Tö!õùÞî㻓WŒÇr·Oëü”3.¬ê…ΟIZÞxu&¶ÕªE^._€|ˆÉ¦ÓßóÁT–»ç´9ìor§ºt3¶±€·µå+7õ‚ñtI†F…üæ]I}š'ÐV®P6†Gü#3ªk®Qµ—Öt–Ù¤–´ô%0’>(v7ÏòÒd,Ed…µÆÊ,v%Q?é&Z­–/â1ç2Û_tú·KÎ ^œµ‚†ðE;HL)•Wâ¦Ï¡Gi}wŒpâ<ÌhÝçL õJÆ Ç仚4xFc¯è¾ùVÜ èð§_³N½¯ù›»[ã™Ê7ûåLŽ1)†t¡ØK«|kg}µãÆ]L_÷Ô4 ¢%qÉUj3N£„¤ó]´k’¾®Õ=f*wS'¨«pçânÓNånŸ;™þ«@ø[Ÿþãžp…z\ÉúÏÔÅÿÒ±¬l=°u\íôjùµå^d0„ÒGRêZÚ ¾……æCo*³ÒÕë3Ì;ÇÈ“ÐùUgMtÒ{˜dÉí` W’ÔÓkR˜ë¯Âg^zÝßw“…u ®×CoL;íA1 e¶¹T¦îpjµ@6Ýu›4I>]Œ ¯P‚–èË9–›¼Žü<”ýf<¹ xi-³êþL}Eúêe®A‚Ú.êD‰ÏÖ%ØQíÑù¶`ëªè2P Sƒ~f‰¥Õ)3žÂXñ¸Lºî-h 7hÔ?,T~¬.âþ¤–Súhg¸HùÖ *#´¬ÊŸrò¢âž½é¦j`“Sž¯%öfiGnúÈ1Q˜ÒVŸZãÞ4RºêŽúAOø‚P—a)×?Äߌ§SfØ j [b¹¾@™Oy@?Å>»Ò¼µÁF– J‹‰×6ñ¼IFC]0·Ï:Íè£ Fa&¦ŠL¿SíìaÙø¶@ ûaw‡E´t?8[Ì)r2yºî6y'$kÖ×>3ï)•?3½ ÷tM]oúÉq £Kâi–^5B.F*©3¯îŠ]½€õ-E!Ϙ¬–ßÂï,êùhpO4fâ¾géaˆ”—Y~r·_Äã<øõÄu—F¬çTù#¨úB Uh•60xsð>³êgØÕÊO¼–Ÿ‡*â—´Oë^bƒgPÆ‚€ ÿD»Fº™°e4®öKG1+úÂ^U·#"eBÜš~Ÿù;+ å:=¾¨“~FÁ»é1Œ—'=$¡}½2¼P(û ú}€‹*:Æø2ñu{ÁÄc®ø\èŸkÄ” z íû }ú´@Žd<ßäöD!F²ÝJoØ% øÝ¶Ç"“… tºwM‚”Åv‰¯$©ý#LK>ËÀD™e)ð7¼\%ç{m¶Húi¥‘[1'Y‡¨JѧˆVæ’„ó·±^­ƒ›œò<‹)~gÛãûíM}ù5?¤6oêÒDtsϺëg•²4t€'®™:»³N”íâ :Xw3¼-¥&™/? ‹‘22A|~‘¥&šÈŠpesIÝXMTŽ*ö™“Âõ-¯=~þÑêö‡ÿkÀÞm•"ä.3SPW]ž’ÇgI}ãn-kšSÀ¡/O‡c“ðq^ýfdQß³Gˆ¬AŸvþ%+ñ5{L óË Í ÂP" ‰¤ñ-“¹ó"-‰ÌÐÇQÖDôÑòaD|<Ð5C܇‡ÍjàêùR±>:‡ýŒãv½Yᙼ8sD¦fvYÕ °L¿§ÆþeGîQ¨b2²ÌÄ SQf®®ëÉl:ζók4(ÿÉ_땃:!ßF÷tç/Xéõ€Ã}[!MΞ@\ÖŽºÖ~ªJ›¤³®ä$WÚ!ñ8§4ÙÃÎ`cÖØT8Ý•—#ޤ/ë—³­¬›±†¹(‘qȺÌâïs ‡†·¥.LþïØÜE] üÔÍ'˜>Æ­´ó‰”¯~î›Ìý“G˜£NúÅMcf&m…Ë}ð<¸$±Ù‘qÐtkÂ%„²vøà©“ኲcjí |J<`¢3KñW»³(ݵ iý |¥Ýrɽ™ù7룥û÷Ä^h:-Q4¨jZCÆÇø–ÃyĪè²=€QוåÙìoiÒ$cîT†#ÑqË\‹M¸õ §öVT?¸Ü;~Ê•‹Ôð°¬f?/3LøÄµpZB ÇðÒàÈ,l‡Š&¸ö")KsÒž¥4- e…|ø«V-í­sC–ÆL‹r6¶±vRG½+ykïXæï¾XÚŽÉ—¦!½›¦ tg¢à¼·Bp–èž&ä³ ¾a]Ó¥×àÔìתå“WG[о7>SsˆTŽræ,…Ú)¾½Ógƒc0ðÅ%<ö ¾ß¦ð- {¬¦m£5N¶ ­M訅·SgQ2O¥¢¤I9M ÿpYO_Õkc¿MaDÖºѺì__wnw„¶Ú(Lº‘ JîoPç5ÙçõNã_;{›©ê§Ú´„…nn>dê±1Ë]( —Km²Þ A[dÎx®QC6ÇÿVaOC»‚±CÒIçœmRèýË™ŽŠè´xõq«n$‚ÈÊЧQ¯ƒ­Ñ þ–Øh Í× `I?Y{?Ý"ÈÿaCœÞ > ²Ø™á¿Ü:w×€ÚY d2F¹>YƒáåÉI­tç†Ã ›õÞª›ÓN…¤d´Ã%%gŸw˘?¨¡”Š„ÿïË1瑤Fµã¢|›óZƒ¼5›{JuøWR¸SUUQn d³š”Ö~ð;óëòÂp–fK‹¢-ØÀy#>XM¸JrÒûo®ØÞ½žF±¥‰}ô¶Ä͇þÈ)‚ncv ñBå~“¨Ö¬6& A­Ö *÷¾äEbk¨eT±`Rcf ´ØÛŠ´Ô©(?ÀV/˜-¡JÄ3lÃbýÌ\aǹ2ï{4ßå:Ó¡=j–cÂç âˆZyWøZØ–ÌR.Ç“økJ–^]J¾†DèF"“Ïxª§ ýAÀìÓSšN»ÁÌXc”ŽN‚îµÐtfÒmóö—ÙŽöÄÜ#‹_ò-Éäà°ô¤ÙíTÊÞ‰u§÷ð4ÑÕyJX\Jãíj=ño?ƒö¤-ܤã•dWu*{ß§¨¶éE1=\פÏÁ±ö‘Œ’Ò+Ùó„g]¬Ý%»è>okûš&_VxÅ¢ŒÇ¡À” šÙSÉ‹×áÍë\ÕÆµ”ÙnÌB%kañ‘ ·upSÚÉRu²mÍ!#Õs Ag>À#yÐ…_õ¾Lº5“”BQXeª½‚‹KŒžÈSiBzi¥î­Î\0/pÔ_ñ¿Ô0¯\m“›s‹ÖFoÌCvfšë½Ùóβ+I­‹xfj7½øÁíC¤Vµ”´ú ÊnÁƒTØÒ[ª.ýŠt‹Ý®Œd.äÖyzöE•/ßU¤É'…¦]v†Áéå–æpú[wÖ íþ>`úóôó˜f]S·|õX±×ø÷šˆ&úw ÚʉY÷Þª#Ý>°Eâ(⡬[²™Ëoê9‚5œPC–ûðz±`?sf? ©¦ ×qþ¬8¹cã?wŒÅÖÑäph¹<ÊÇyisíá8ìXÈ#–éÃÅ—ÐΜj·cr à!ŠøXqŽfjÏÀkK9QýEÔ.þ‹wú°G<0뢺÷÷)o1w¾RU>Sý-Ób§&†Ä2{½þÎ&uéûz’ßR—;?øW‹¦°-°Kkx¡ Á³QÔæ·—]92ŠSöUi+ |=°ègifKI§K‚Ÿµ¹ eQíÔâ^hæ’•†¡àÞ><— /twÁ:oFWèi:Y/«Æílz]Éy3å1;]²'ùœ“y5duD&kŠâòö›*vÜUg’ó{¨C.¹\‡SFÞŠZ¤‡˜|ˆ©T¥œ…Á°žb”2w­¾Iîí3èFÌØY Êݯ}Õ”N/ŠããÄ)@*ý‘ Ñj¿@lØK€Cî©%­'ÜòaE¬5%pËíVøbh±µzO‚pq{<þyÔ3Dü.Û3“4p-SXdèƒR?v‘ASHÑ©£j8,Ù~f¯K̽róJh~D Ì8ÏÇ‹wl/н1]©tUœÓåag;¢Îù#ž ór9‹ª/Ú2)ÔLž®VO@-¢wÙÃúI7Lh˜ÉúDÅßÝf`„ƒ€ˆÜqç×âWEcÒüKÿί9c±ðÕ/ùŠ#§]U=â9è€ÁEÄ_· ae"àC1þUR(=:/òóãæîáÔ´3ÒôèQkßìÓg­ôqÿÜ ©°m¥ /ÁllU⪈î(ây‰ ÁgU–¶d ³L@h‡–oO‘œù0g‹>›o|㌤Ìúq\‰uô}òá»ð€Bh<Ö€¸CO‹×`²#¬%3ÊáSÍö [_ò¤uÌçÌ3¼i~ÀòXHU‹m륙šg¦„e‡ZÞÈÖÔ$ û»Þ…üÛvÀ‰ê¬L‡Ü2ýžƒÜ’±b¿i¯kŒ–ú-bú7ÒM±Sø¾h Ù‹ýß0EÔørÉ9óëDxt‹€iC‘:¿²[;¡J›áÌ›-¢e*¼Ø´$íÅ*\:/ÎÎP»·U¦œÝþĠη/v;Â>m¥¿¡bíSáŸÍºKóH†œð¯R¤² ’¶Ç;£².íô÷IâS°vç#U¶ôü ð!Ë]¤.Á]ê ©ú4Cù ¬Ó9Œ è¥yêßwæ 4hÔ¡T^ê/õòÇï¹üÐ…P[^ýrô#}žEêÌÃRÛ`%á]¹8ÄÙ¥õÒRót ¶×{?U‚õˆûÍ.€¬ØJÞ8®g¡MŸÙȆãœáÖÎ8$͉T.ÆOȳ ŒP«DD–Úâ‚u«Ü[.†Zt–ˆ†&YD]Í6Ð[O¬U6*1V¸/iHÖÇ8Ö”sÈ$²ŒÙ¿ìÈÃÿVJóMï\UŽì¬­Î,¼ñrŸUtÿæ5a1ð™¥E晤6D±Ç é™’ _üŠöí÷­>à¨Ù«as_Тh62Ä_Ãh¹.j¸éб†)åüþM08‚*Ï¥óƒõUÇ:tœƒʰ¯Bn¦dJ,TzOâ¦vyè¢è$^ˆÍ¯àoHÛ#SÞ͘Nî¯ î‹D» 5Ü-@€$Þ\Q/nÕùÔÖÐM)úYà*.À’”Ýû®| qBÃUZ+¬±é§bç*C§õ“êšüðI]·OÃŒaœ ¬¼s~e,ƒDž*ô™¡^´÷SµÚ1-¥ÆçIc^§ŽxÙñ¹ÅY}Ý 4ü¶*Q€¿RGãF¢„‹Ød)pÃñ5Å›MCITEF¬´ö‡Ô£¨µNyI¹ iŽöwݶÐÉÊáÂËÆÕ˜ô…')DS©vJ F|ëòUj-ܸ/>Ê,ƒöjðJ~u´ÊÒü§Pª'òªÈ•Î騗ØA§–“2}‰TÀà1$£.F¢+Ž¤Ø¸E¼Î@Õï¶OU–z_*j>'pÄsÿ ‰Ý¾ÝÈÇH,ÚžyÈ_0´1û{2+ÿ\'•-ÀãhŒcÊ‹€ÓBÇIãÜRwQT¡e"ÄÐÇ•bΤûG­+êp’ÑðoùÅU(„µòeáèÉåí ÷óÇÒý¥&šü9ùå 6t>Ýj“ E$5u–{G¢Ê"&+Í©PÎ;$þÁ~‘Èo¥ÖQý·K¨Ç$É-˸•áUŠ¡’™½ÍDê*ï¹Ç¥ýŸ¢ÏÌÎl›¨SÜjËIP=í×ó3ä{Ò–ö±a›²,¿ècîiYy[ÏÜôö+ù2?ÁP޷׉1£Díb®´‡"»ó)œcWË]5¥ *ÏZSzbî~c_þªRŠ7Xhûþy"’÷cž:å*ã!zØ×¥Ž{ pzTÇB±ó茭šR§{SZôJ+¶KýRò+eï‰T9í ³ÊX¹W•½´š;sd/v™6„[*Âr¦¤Éx<ø#˵‹’‹ÖeÊ~Å0ÿ"T[äž U´õ»è[…ô2ˆñýi@ f¹ŒÀËœà–J©òsfÁéiÄ8­MÕÁGXsûRAh%/ÕÛmïkmÎÑ‚BÖ&QbÈ™8à!É>*rµÝ8Ññ¦Uöø˘,{À½ÜNvÏ$žÀ²«•òŸÿB´TVE~-Sôž‰šp²xõ&ˆzëqñ&»HÔËôH”F>Íç>Umäšr÷ÖdŸ¡a¶@4uã̧Wt5†A$µ;ºAõ¡¬ˆ¿¯x*™=Ñ€ÌËø8m™õ£mt,í}}î‚« B5ð…–)¯ÂÉ×Ó{XÅ a˧Ùoê•Ï…G­Ò”yOò)ÈHg9t)F©<ν Õù @Ϥj;„ÕÍçêueÉÃQÎ9fqÁ>§«çR„Y¾Q™9T’UÓÃWm„¹ô«&UÖ&µÆõî\ŽwÝfaýZ´Ã݆°EwÝ)Vp-#×0¤ÁŸZÅzÆÕŒ›%‘^€”F1æ†nYªcÓ{UªbSQ·m ûœ­þZÑòÊÚeŸ0N!2/uþðŒŠ!½HyHíã0<0{a«Óó.£;A/ë¡[»×Vº„%» /=…XÚ‡Uëk<ˆ7"±õ$c]}ÊdiÕ¡ñqìnAN>f)µÄª Í*ìÒ@~6Tp_h!ªÀˆ«aùî²·!êb” äZò&ë ;ï4ç]ÙíGMÙ÷³¸æ®õ¹ÌpN_‹gJ\ßTXhGÇ0iKqÉ (v¨ø°¯:,R€¸©P©Iï²eøÒ:Zê,.éÏܽ7yõ{Ìa zl ÊÐÕ¾³¸a ¾®ÌÙ±·åKxjÓšiuöƒ÷®ØÈ$ «·o çnXô0?=Í~¹˜ŸL.×·ŒP‘¿&ŠbdatÈ(_´ÏPUwÓ¦ç "’v b@?·árÒEµ°‡ö°öyÞ©H(å -º¦Z.Š<Õ­b!SkÖÇâ8â™Í}¦*à¢Sd3`,Êù)„õ(4ƒ ÌA†!YL‡% TU—±Ë¾6¹«HŠƒJÕlbè*íÄk‚Ä–šJoå»TÍÀôøštŠþó8Æ„½Êí:S†œiù®ŽŸ¸)¯ÏÇç¢ Gk¨ hñj÷ÿ«jCŒU¬3 …ÕUœ~ÁçÚý¿Ì iÁ©šŠš¯á5ÒØ1sôfCå¼ñÔ ·Ø×KáíÉ}ÐόتjÏ)„ËŠÚÖšíì͹ ml^fUq4}Ëé²Â¡ ¤¸±QÖ.MêûÓ“—¤‘ì…è/#H+.ÐÅÍ.F˜Sè¸Ûë­¡c*lC0<2M¸°!熰aÏzeïŸN“?ßH‹{P‹¦”-×alU£…2óœ…ìl?EܱGÊ@߃‹`¡úÞ\häî™É}^T\,²öe …!ßiy~ç’J<‘B]tÝRIáì¬Zâûs|¸/%Ôþý,%ÊÆ &"îê˜f+‘b\7±a€l±} ws~>`’Bt¦Vÿ$¼j› ¸ŠÊkd¯Ij¶ŒgY-ÆÖlïgÆ+÷%%—¿ ÓaóŠëŒc¿Pö×iP®9ʸeŠWKõF2œ0ßä7Â#ã³L=ÆÄ>‚HÒ^¦ Î)É ÐÏÞ„æÔ¨f‡b#6"CÞbû!ñå&I§ä=G4%5ZA0O ÑËž¼ è3$t˜oÉ£Gâh¤¼-·„_­sSc÷Í5‚ÃÈ&Ëgéæ–‰à›–;¿¿R(­ªq´`o€h‘ä×9ûsñ=„ÂB3]çC¯É®>—RP©Â,Æö"¹ÝR83#0(îçLWökw ÈÆŒ~‰"¡=o7•WŒ\ SÁÿZ»¿¤NÔY„6váÇÞA·x\Ó wœÿ91—²„¶ÛçÚ î_ªW “›¦ëØKÏÔ4ý9¦päùÙ~NYøqJÑjùƒ¨;ÿ”FI/É}Ø ä“„–UJV, q²‡OÆ8>ýŸ ÃJE5ß·£òä«ÃŒ„/ûSƒ÷ʺšŒ•ÑQ®zeïVü™k¨°™æˆ•n!z×6ÜÄ&ag7Aœ›¶ª‹¯èÀA˜^ǨšÙ$–²Â,ë<þ°v |†ÉŒ'Þ«H‘ܽõ2ðB›td•éˆó‹"3ë‚Ù,|&È'r™ƒo&4ÈjE' d} /™ÌÁäáòæVÖÅÞgþÁLÁ¾Gaô”K¿ÈEÙ”hÁŽÞ‘ ÉM@b{$&¹þ»Zžòyš´Àg²þ¹554n¡ßžŠ)zÏØÚ ™›{>>¿Ïxv£Æj”‰ðï¥6*ÍýÆQµ|NÁ6¨Í&€CË<)±»,Eì²àEÈè\ ä{ù‰‰M`{©Û®Î É¥™½7Ä.Ë´™icj'±åãû¡êÒìZ¼],=H¿&æO$ )÷lsƒÆ.;Ÿœˆ£É*¸ÑgÐäbvk}s/Üf^Ο^à^º5›™`®Ûù gÐK3*èD¼ÌàL¹'ƒ<¶å÷@Q“6d—ò~ìåc¯(T`Sâ{·gÄÍÕÇÝG¶o·§£[gt=RYøx H´‡­ ËÈ °!D÷ûa‹¹$¸‹0Ç•f»yÛù7¯Õ%ÍM[˜Éâ€îLߤG°nÖmNV»ÝÇ"Ab¹ûáìN„çtÆŽTĦ®¿:Wš+$p Ð~Xg2¢D¾D±%ã-|ò¿ðF>ê·gÄ(¥£o« ñÁ'9ÆU kcˆJÊ0öªCTS:–žºŒŽ)“èÛ/wZ“tRJ†Jßk½p‹²úïëä:‚TÙU"¨F{Wó÷ÜN'¹YŒf†ä¿rÙØ¦VïÀ™QP䎣âŒâ š ¹þÞk‰dßR'Zôë;˜ÝnŒÐeîHý=±f°rî[Þt댎ê ÇfÓxÏË[¹tÎÎ+ϧí¸ðÝí %€¶Ó6<ÇEëiX*Ìt9Èð…ÅšûA£¬aŸËœƒ/¼b0€¾=_šàä¡@™%ZÄ‘8c"eÑ;å³Ðj§ßÂüÅ¥Nvkh§”µö])Õ”OIVÜâ'®)6ê!ÂÞEj&ˆ!æÉJ†Æ|Ô-Yš–›(Z#Õq4*©)µ7^òO7ÎÓÒ–ÑâÂ_ò§ ó+¢ÁY…8íž’OÔ´Ø1ˆ'¸èN2·bd´;PZžS'~Jèô8ve+h`÷Uá7ÿÉwYâ®¶ëÿ½ÉEèO–EíÓ’HÏY3•ÔÀø8èg™3¿‡´rÑlr‰~T޳룗QiÝX™HgY€ú&ô+>°õo–z•» )ô¾ž.o%ÍÜ…¦6× ü´éžµÌü×OãȦ2Uti[èUPÁÀ?C¶MÛM*þèôŒ€Åã«Ë“•ÏÏl¢TòõÞÓÉ…ßZefGÔê•P5K]³›ÐÒu–αJ®²Ÿ>$ÍM^[4·}IXÜ—·HŸÔŒ¤=»³Lâ £ æÍfÓq˜+_ó‡;(¦ÄBFi{ n§h*§úêâ² Bš³y–svašÂÅìQ%Ãʻќš54×.7FTàùÞuÝh´ñvÊM6™–—;F˜³¾"q j¼ÙÎ÷p)ÀH›‡ÜÓdÎ|!×ú G5›Ó¤êÚ©@C‡Á]M\T‡O|øpÐÑ%pºZ/±Væl¥9ßuþÇÍì`\:¯÷³ì”ð¼8’þ8A8ì“ȃ‰íºÏ€TR…8‘{õH¢ È»œV@Œ¹{9.Êj'U½RR3×gjC4<aÃÖW“h÷+ª’a$)*‰8‹iòer¡r¦å®Ì?··Éÿï(YÃâAQŠï/mV?Z|Œí`á½$üso/Ä2ô¢”‰ÀaÆ6ntéùßKÜý–yçTU˜Œ>¢|©Zj¿â­^Ëв8ny«¨ÓÌÚ 8´¤h*ÉU§FÈs‘´‘ßg+B‚’´óƒ2`ÄñצD¡™bÀ‘å+LnCÂO(µ9@e©ß´rq̆c}Ájû,1GìÊ^ «`Ñ­0ªûL¦nŸíÁcj*\I(e•|-/Ð ¼¦Ì®wŒŒÆG€¤yU_œpq~pt1ezÌAÕƒ=ß=¯_¼îæg¤“T ø2ž‹Ü/ê¢ÕQ2 îýu±LþêE_=°!'ò¶ ý¥À4DO» Ѷîí{ß ØáŒ¤i÷#$'2Ìoáß‘uªäP0EQ»(’cFòüKE»kÂáξZòÄÕ Î-2lü͈¬´LÍÿñ¤./: ÞÞ]ñó£‰&œÙUÙ\JTî9EÃÇV÷®ù#ä-}²}ÆtÃÝÞxÐùz³‡Tš5ÍçŠ[lž A˪˜4-Š<íü?X§û#±´åØ¥e?ÿ¸ž+oˆ¿ZDfÒ!E¬:”j   ÇRŽ?¸²h­´Öídõî)Î?šÇïIöóeP†Ãƒ<¼ªLÞ´IîºóÅ©u2í eQ£Tq'ú£·»ø2&–Ê» ÂC4¹¯†ýV|1Œö1:Ì­õ¶·Èä¶àÓ¿¤sb¤¸ŸsMŸ‰ž‡ýìa,Ÿ’µY ªûêR.£-‰MtÂLÉCà–NGvV»†ŸÙLóZÊñ+xÄM—ÅzGtéÏ’[Fj wæÌêyn¤+lŽ“-j©o'U¿<Ân”,¦4-sáÂèd°¦Ÿ¸-ãPI¡ Uðä½;VÛõ£{þçÑÔ‘¡ÝVÇB¥*¿i3¥!òò¸}‡"T¥¤zÒóµù¿<®Ý€RÜsöi¡ðÙ™ ‘}¼j|—‚ãE3ÅCß<ð-^ÄÚ.©Bƒc„Ù@Ácáöl¸ŠF¸+–r‘w0V·Ä ÆìÖÎ4ã6Ÿ,;åË¡TQ°ØÔ;lA²§d¢Õvî´SLîé8ÛC^x žEfkí8¬¦Ç¨0»†’[Mˆm$9ÆUxn9­ “ í{Þõ€áãQ’%—òv,$a…o«öÊ>‹è‚›ß3%Ar .zÛWèz0|_‰VCÊ—ö"'q ÜujûQê0zK\…Ô— „Áv ã»íЙ÷z¤fª^ÿ3†±jÆWæl¸²²<FÓ—Ëf”æMôòc¬Ét´BbÎZüi¬æfvø€‹Óv~âÍ&Ƽá’Æ¡·˜öt„nñö¹è=Ü©WHÈï(YÆUÇ~÷¬¥º’ªžøaxp¹²øRmfRÉž¦{"3T°[íçùl¼m¯ÎCPÊn]žT3¾ää¯ÏåeŒÀä·s¿ïÔ=âGXÆäÊ×cŠXHòX¹[† @‰ÕÒRž8Ÿ3›JIÍýsPáû9 g*Ý!sâ¡äü~÷¶#Íy_ àÒŽc/–g“tzz²òE½²M6]“bSk, ß 0­J’ŒfB׈Ÿ^’ù:<=5I%¶þRŽõŸ³ß…Ddëè8>!]èƒH+ wIþ…H~sØ3ÚNf/§³Ãõ-c?è÷ n"QSk,ÿTq&COã`å¬}½5Y…¤&r\Ka´åºš”p’ûm'àmtçîrÙ¶ìÊä΄°V7¸‹^?¢ŒIm´—3W­0ô3ŒmW.^6«§«f_@”´""°!ÅãQWôÇÁ‡†™—æ |ÝiÈ4:¼Öëéü\£;ÃǃÊ1_ië9<Ù×'¥êîd¶ßò¨ HÃ=àÅqž üŸˆ%pI:þ?v=?= ô†h|fw³Î(Ù%qRieH‡óo¡ã \íxõû@š:(V÷‰ÀÌØ¤fb«W>ë± endstream endobj 79 0 obj << /Length1 727 /Length2 15231 /Length3 0 /Length 15805 /Filter /FlateDecode >> stream xÚm¹c.]¶-\ÜeÛ¶mÛ¶ñ”ms—mÛ¶mÛ¶wÙØU÷íîÛçÆùâ‹ü31VÌ1Çš™+2‘¸½‹ª§€‰Ž‰ž‘›PE\X“‰™‘‘‘žšŒLÄ `äbio'jäà&Ô˜ª™˜ ÿ0A“ŠØ;x:Yš[¸RšPý;H¨ncdjikéD¨nocïfibAÈëææ&èæìJïäÊOÿÏ"€ÐÅ@hfi QPÔ’’— ¤”W#”ØœŒl]m,Me-MvÎ*B3{'B›ÿ8„&öv¦–ÿâäLÿovn'—ˆ™9ÙÛʉ© ‰+È«Љ0¨ŠÙ™ÊJþ³ÜÎÅ™û4ÀÄØã_ÝѺüecô?–ñÿXÿ“uòøEÍÄDhjiâBh 0·´ƒfø—nRvfö„ìÿ ›º:ü7õ!çøRþ£!¡)Àì´«¼‘-€RÄÞÖÁÕàD(go p²#¶·1%ópØ™Lÿ‹6²µ´ñüÿÅÿ_„”‹Ñ?zÙ™ÿ£ ãB–Îâ–SEK—$73²ùGªÇ5ÿÙŸúÏêJþ³¯¦öv6žÿ·à?Íü»ƒª¶Š†ÍÿŒÁ¿Óbv&ö¦–væ„*.ÿ(jädú?§,ÿ3Cÿ¥òß™"dú¾œ‘‹“¥¡#ý¿†„ñ_Ï-½ÿ‡¶÷ð¦cff!¤cab'dbçb%äbfóý_tM\œv.ÿ–ýŸ^þëÿ{œ€ ôƪ½ Ïo«´ÖÐ ?±¢ùJpšùYC5šU&൙Þ[$Ëa SƒãkìUì|wX¼¹@c¾ý?{R-ÄFqØÓ©éh¢p½Uì·’Js¿Ú¥‚÷†pý0u,[y°Ûˆ{—ŒÍ EêiÖ¬ÜËZiÇ2>$ ¦hÃòÎpÄÝøõ¥'; *= äLíoXÀ!M â¼EHá±ÀÛÁHX~ð>ì-–EaE Ãq˜vþá“Q'úåóo[ 1ûH­ÎŽì™Rþ*1àŸð=Ùýí<å0r6¢Ô…õˆëÇö¬|ít"]lêû‹¨ÒE}þ R-uôÜó]Yn÷CìU’]Ö?ÎãaÊ&f*bËÚ‰ C4Ë}ÇÜvyöXññ¯S`ä…ç.5«uVAæ#|||¶K7óä=Ç÷+U“u§‚P颭9Î SI1•¡#…Orî÷ßC=TB÷àôRé_±#Võщ˖¬ ûöW¡eŒ"uÉ’PO¨ªP” ë±/™í¬L~·m¼]~:þw"#une´«ÜáúBmXdŸL°gÁ-y·mìßìUË}Ü7 š÷1Ú… ^=0‹ü]›ß“_húÁ#½lj!G¿d2îÒD«÷½9+0ÒÒä€sMúÃísy09Žv–™ïš"å\ÑYNHÝê™m7טjœVïò¡?å?a´Œ9ÏJ½ÀUx‚âðnƒSIÝžº-ò¯Ç0%Ø2‡²NµÊÉ Ç0R¤ƒ¹r×.ÌàÚ„úX33(¾6Þ¨3eût®Œ7HøBŸC±Àq—àÌRºþ<”6q£ó†µs¢É>y«ޤàÚ0µW¤¸\^§¸7šïù|’Ó‚©4.+ °?ú‹ÆãT¡p£ ê×ïØs+$ãðÛ[“#‹-•âc_8wû…g̲ýQHVQï‘u¿tt‚(¤k˜Bƒ$Clû° Zwò¦ïYUÿÈÆ‘„-ìÒy´ NBgåìÊÞR7ªÖÚ~BÁ¦J;…Lg Yˆ1L’ÖÁÔmëÕ?¶œRL)ä9šÕ¾4¿w¿ÉÍõ­ÎJµ´¬U ÖßËpŒ%Þ´ÀÈB&vu»Â]I·È O›¯ ûu¾—@;cÝŠ52òóv'NûV#‚ Ç&’Ï"ÆyõÒÕûÇp;.Âí±-+|àï~f0#fèn$öŸºPˆæ\JgšÍàT¨ÅÉÃËH)› Ýß 9—ZXž7: á jŸ“d¨'0¶¿õ°þâPªD··ÍZþÔM0!ºâüVn¸{+š'”¾ž7MÐA;-!ƒN‚§‘‹íõÑ* ð%<1ãm ZŸŽ7ñ¯,QE´–Ëžÿƒ”Ö¥þÀ¾†þªM 0ÔâuqY a]Àâû»r¦,àuà‹Ñ)£¾$­œG[ü‰Ûûn8­zÐÕAš6Œð¬úùàû@ï„{2]¶±Â$ÿ]ÈßÄ„é$AÃP“¦±[e†’ÌOþUN‹ÌÍ/ ™îUqØU7¿ƒ$Mv;Àkølp&ošÜjµ?Œñõ±›ë‡x2å¡ïUm§:Y‡ØZÄ[¿:×î/ 1×¥äѸÑÃ@ø¡Ät­#ÕC6oB‚~ ¹Öù$n& ÈŒ¦ /úUòš5Xäl”%óÒâ­¿œ\WÒ[ŠŽÅ¡"î¼¾¬ ™ ;#Ó‹p‘ àbzœýC‘› ‡aOD0qRŠ k鏿ÐA‚ˆ†a1·aDlê[?¾7•,<ò®"<öŠôÌpÇhö‰;÷¸±ŸÓeÈhèl<¬–JÚEõDàSi³b½2¼Jq¹5€£%H¹*µ1K(=5Vþe.£u74…J_Ó+¨°ã¼B¯s—ñãøÔŒnÓqÏR1šØ™ÂI½Xá®ïRæÐnu»´|îBQÑì$Š4¦Uàà0ÙíŠ$õ¶9°ÿ€*ê 寘}–šòhã~AB[©ìtTÈ[ƒöŽ¢-YcÏŒÁKÓæ3OBuJåA\nÈÊœ¯öUµKËo{¤â€÷¬OåídÇ ›3˜"\b·é›ÑD-Áœdñ[u´ C÷îm ÛÏ¡mA2¦g*Ùq„¤ð'¨ÌÎÎIÄ”¥éÐz§@ðˆíÔà_N߉’Æœóþ:î<6 2™<”ß4›˜heWý "[á#¼:'î7l0À±ŠÆè™)ðwD²äüU•Þ)AS–Qõ3úå-WSæŒRó8žŽËC>L¯¼¥Â\éËøÆêìO|­À™!s°»•hßM«gÒ(ä6©SUµÛ‹ßð¹(ô÷—\(ÌY´ÊQq ¼ÚùÁ&!5•üTëéÅê'è>.›¢ô;…1X¨E}÷"´I<ó/ø^^ÛÙòcç¡mmªB0‹wXôjøâi4Àº2#bUê8e›8ØÉ–×⪘D7h䶉lí !*2§/üþG!#KI©SsS/YŸeBá˜ÕÃæ[kh()6È*Úyw²³°+Ï_ 2¹‰ýÄàt‹Õóê.s 5}“Œ]´jÂŽ=,è#EÔ?z·âôS>¿v!b¶N¯™6DÇ[`“ÓºÌð Å ƒ­?'H—ŵVÏvT³Á©_Ô›^ÌwM²náªjІHxzðpíͧ…º 8 ì,1PxÞÿNÉö #Å‚(%ï6p}”n‰K-(–1ÒÎmy94?Á_•4r[ŠÎ*¨oãYb酦Ǔ…PNºnÌîƒZ/E2r¦ãUF 3øqgŒÿH¸¦ÔY¨î)j²¼®1æ°JµÏ„3s ZØ–‰Õ‹0ƒÛÚ DÍŒq&j =ØW”¸È©IPW ¼k²›5z9‚Í¡9”±˜ÕðúÌ]PXã:ë4+RܪhŒ’ðÁŸ7tÅq5KÓDžˆánѹ›c†ð’¾8 ft;ÉЀñ=™MÞ%ø #צÐtô²ªðAÌÁ]½/&Äh@e)j¤²zÆòøp•qlY)ð¼f]Fi‡*©ÖËÖI‹5O˜âWÔ¯—¹µ:UQ :º¶4åÂÄ’ÜQÉ»ª7|àߌò‹î\%Ä3£“±HÒ¤òÜcâÁ ¤-û]†74á†þU²­•‡²œÆ'a8Æ9Yú¢hñWd¯ªFõÌ[ÉÄ ¦fì*"Ù–SñôËZËŠÏA!õƵgÐÆ~Õ½˜5¾Æ¸#[O2V5bµ/û{’¨·þ"™©Õý¹¦gŒM “kêÖ ×Ç”Vœ2v Å:1y°Ppk¤—̸Z¢9ד“ÛÐ þ±ìåÎ7œ³Ç¢ºr¹ÜƒÖýÖçÇaSñÊߨ=äšA ™B[xø¶¿p¾†ƒ±Á"'åùY¡ÕJ.WÅä¹E•^\Pc MG@9DDåÙ÷è"ÒRªŠ¸½ã–œ»‘#$Fâ¦>À¶ù!\ èqH5' hŠ‚eÜ{‰aílt;º2• )*·Ø]Ú™c‘ü‚9Rí‘ç]˜NçJ´1û9}+:3'GsOV&EA‘1¸“Ȧž`Ÿ5~ûeI˜jeWÍyã•¥ÿT4Ú‰D ÒšnS9›ÁGq¼õYQ? rý±qOäE?Mfg|6çÇc6OÛiƒ%ý½øI±9ã›g/ymtóúãqˆÆÅà) ͳIH¤mÓM¥l¹LÛÿ·N S:#‰Rœ–Åfã·{"BB” §bÊ;´q¤ú.Pñ•EsGÂz¥ÄØž³Æµ »:QÚàÍ 7ÎÆúu…|ÆŽçƒæÙSŽRUÔD{+›ýÅEßÄàO5½ëÌbô“ÈÖ/ûÊŸÏ+úã:¯ßr=ghfãwÝ­ª¹üìý)‡´5È—àþµX€(Œ$¿1± T‘l«ÍOucæX)#—Ž;‡!Æ›æ)kdþ h§LàÆ¥ºZÚl89Å{-¿EÞì ¯”lªõ‰tâ*_gKºe˜÷.;¨c%Qã•De{’n±å)…ZVtbCÛ¹íc‹*@¢Çj»E;̓L3›B–ZÆØË<]7|p ˆÚ×6»r„­åË£Š037m2iêÝ·>&»:»#ëœ5 NÜ!ÎÒÅ£¡Mþj‚û¥û%Na®_t» Î4¸¤ò˜'â¯afç ‡&!f–úÅöôZ­>v^UaèíÀïE­‡ÈÓœöÛ”L ˜ínŒW®mj°8¨WÍ ¨¨}Nz†ß:ZçÓyìw‰@3\™O{Xuн :?Ä“Wpl 'ÞeþrhßÍï[æ~ƒ6ªÿÏ÷cÈ»}ßôio÷!xRA䀯7kLx>ó"çh‘ãæ6_3ŽÈ ‹_Â6F SÞÍhj†ëÄ9𠛆Ë0c”V¸½¾ž¿™’ð¾ƒ_üÖ¤øjé&l…!(ÍÖÍ#žÍÍú½1JWEn’O·&1×ø››û-ÕK©ÆŠˆ'Ç=Çò)ÄùqW6TÙzËÀXt^ŠiN—FA›ÂŽD‚¼ÇÈDõ±kGó¹Mß½fh†¡§ç{Áx˜ÍD2fu’çÇfz…ÐÆ,‹o\q3Ës´è–[¡»®;‘µº¨&3ý”!îv<›³Ðá-ýIýQòȸqð•¤üs®¼Ö!÷ˆ=g ¡^?©ÖœOòª.>Å7´,™Ç]F{áL[["÷žñ!1äu 8•êÓÄPℵÂäïeÛâjÅ!4Ó®ƒæ‘Àâó¸gMùÉ -Õ™?ZÅ–Ù¹š —)QíÕð ãŒÏBê­‹ZWëZSYø2ªœj¹D°};þ”¡—w—,Q¤_—ÙØ/@¢"1¤¤Õ)û¬ùÉ|ݹº{õ—‘ šÉ Á¨w$‘® ºŽ`ÙH&à¿>;2vKqúÄ]¿ä±a~ˆïŒ".•“>Ÿ¦±I˵ýåºî°H»éÃfè¸g4IªoL%š9îê]&%×pƒFñ†™}›Û£Ÿ6¹«h»§¹h ÓŠ‰vrì冋÷#H‹gOàÓ$às|]Æ »FÒ/ˆÐað?5½‘ä¢,ƒ^ܱiYÌîóI6š¨ o‚g܉o¦¤%hü䇳gŸ½ ÷eDÂÚ³iøïyAæCÌ×ãS™½Ž—!iÚ Ùê~ý€^å…Zƒ'>A¯C« mµggõ؇‘ýä÷/ñ*å\R?óTã¯È÷hHï‘l§+<ßêv‡tó:Bs-ؤ”ƒ¾½*­ótÓB§-Ë¿¥9 }^ª”Jò•²‚›‡5þ%5”.ÉK,C›sò"ÁjPuPH4Übøí~Ùø¡ª>{?šGðâýz t|Ổ†åÑ¿T‹à\Yp)ÇC†äýR£Ù­6ÎâJ¶b®X:,Q…¡¶:Vkà#_0ÓY\¡lóµ~Oá±ùs«øñQ‰â±,.¥qíŒxêÂU‹0ŸûN‘~¼ ûÝÂMG¤?vs2-r~¬ý™ ÑšWL¾î˽íÛ#»9«\ÜóûÛÄ«4m‘ýÄpÔøýÂBål3«Ó²VÚ&i§l5&Ùaëå÷‰c?cÇ[Ç‹Î<;c,ž' tDÍ»/•^;õ…)* ê¬d Ͳtå+ö¬ˆ6À®WËÂòãÙj\ 0¸Ô!íoÃÏú‹ ¹£Ï[×ÖˆÙ‘·ŠçÚXžŒÊ\ßÅâfóqÀÙ!$Ehq4zCÍ¡ ÏÇžr|~ÁGëTÉt;¼v}¡aÂMø‰”ºlU _Jç¥Êùdì<°ÔÁþºÆíçï6¼<8 ñìå¤/AAp÷µ¡Ù{÷£Þ©ì¢IYâÁE(Ô†¬®#ûö·Šµ°Òúö>]”eËV0¶*ž¿…¹Æ™¬ —yLœC7°Œã-Ÿõ5{ú¢£Pæ¨Ê±×™ü¥Dìd¶.ùAcÞ„A&nÐÑcï EÃeþˆ[)×tjÂ×ý!Ã4­áÄt2sÝSÆ¢ò߀÷â·´¯Ç±pæ nTã³ø²ÖCVÐÌséu¶#ûÍû³+±U¹ðr‡Ž$ƒNŸ/"åj$rɨ¤Dœ]Éá_õWy‹ Ï‚m¿®DQ@ì"GÅn³ 6r¬hSaETD½„Z }**X‘xîAyö1FÈ|eø |œ‹_~Ú†£b?ŸÇq@<¢èæ0]Õ­\CÌ^ TnÜÏ*ö° …ýÛ9Q&º­pýc¼:в3 ¯|…üû}µ GþyM\}Ið|áyƒsëuã¤6’.D q2h’÷Ad!σ„ÚÀÊnB‹“ÑÍ¡Ð:nz n¼Øâz¡@'ª¨EOèB²9KVø<ÙâŽ"ötÐǼþѪó-[»GÓyƒåAÒ¡Å+É ÒjåFu DÁñ&|ÉHK@·ÂBn¶Ù)Šù…\÷š2;±›¦*B‚ja® ÄŸYæYéÌ…Cl«ÄôŸt Z ¾_RíÚ![œÙ¿ o–à=64Ú»w_GèW»áè\7š3-Èp.Nü¼÷{¯iàuÄÊåOŸ`ø™›³â[ÉvΊ0)¨´Bh«J¤€âRº úê‚y·eR›`‘¯ˆž†ûbsK¥±âjT<ÞQ¿É~™ZW@çEðs“ULå¿xäy“T‰á²HÃ1ã>ñèžeñB‡ƒ•öOà f?°!õugWeN…µ€ë OõæŠéŠ(󜽯b1¼[Œ¨fUú!èää‘—@‰ÝƒÓ£Ê¨èXA3€» ÿ‘þò½ˆü™ù…–½¶/+ýÔO”#Mi(Š1Åÿ­=òû8™_äýÌQhBèÉ7Ýô¾É O\ÆiªÏ¡7zÊÙ,鼨#¨Q»þ]B6†Œë Á#~÷}Òz‘ŠÖóY-[ÂxHÆÒqo¢«Óì1>e zg㤕e¾\iå:ƒS0cNv;¿Sè+Àº‚åq"‘çn©‘ï‚e€@Ìùw› ê.!ý (èÕ±’ì:ÕQ¼þg~˜/Èß­Q5hÐè/gÌžé«*R1ìó Γi-ShIWØ>úRŦ¥µ–wÖ1¥¯U¤ñ÷Ë»_ô¾ å“3ÚÛ Ç·³`ìñf£i n€eס¤ÔÕ1~ý®1H"šy†|‰\ùY– ͥᥣû5Å9?¢ñ'•„—_\eu@}×ïú5• A•–ÜÜC ´ Ž¢hqKFæŸO…ô$–Ý. 7œÔiÚQ’÷Xq·”Õ×¾×Ú<{¯ð‡¬„|Ô‰N)®

ˆ§ /)¶3Ï“E²Ë¶¶¹õ¼æ2#QüYàYHyÁºu­Ý”Á $F;þõm$JÁw þ/Òà•EÉüÍ@qÝpóˆM—ßV~_˹旛¿˜ÿ²ØøáHÐ;¿êÀ¶Z§;}¨L—ÍŽ\Î|*÷Nˆœ’µ <-nI1»CEí:R&ËÞŸÕSK²õåoœ QÖü™¥®„Æ@¸_aŒøò †šÀò1ð"3&ÇŽ#ðY Ðyš}ªÁí6ËTmÀB5JVêÛe+N t¦ST9ü½®æ NL Ó×'\>Ê1d^òr¸§+1—Ö†|E 8*bò8“dÛxp²þdDg×Ç–vxæu›*1,Ýä"dfšð¾%##Oq*¦2T^H²özšŸÖ?:œi¾ ‡ é®á·èŽù5TH¶ËÜ›eíg½éÂ1z˜t ½³v µ¤˜v]í÷2á!³öYç÷g¿éÁ~Í»ÃVUÕsƒ´_N†H=ZZð’¤ÍQ‰&ÊâÇŠ8M`çr'qÜŽÛuÔöîÛCC³Ÿü.·¾ïAœÇšo•NEã×§Ž7cÔã¥êOÇŸX–˜ü 7’‰dF+|í[ãûöáãÀV^\¯f„¿TÂÒa§4® ÛUÑS#œ:;íRÇÞ($Y58óÁ +”+Wóüª ôûEÛDP¨'zZ¡g‹’DƒÓú/i{ -(ͤ;±àhxnöàîÌpËu…d­s»Öxf@êî/1›êa€¶ZçÓŽ¬=§¬Y±­ÁèÖéÃ-\¡Òó}“Ña5“Ðúªü¼ƒ0xyôR"ã” ™Yø8 ײ…̺ªÒl°qí,%sOz¢Ö¶ (µ¬×n®x8psÛÓQ¦"²‹\9ò[ü4/F×Ó2xãD½£D8 ;ýTäj¨l½M#¾Ý­ÓIr"{\)i‰GìÓ´Ï$+‹ó$À„„®y×g“÷«+ü¤£«Y@À1Jí@.\;©/;™ ¿ 'Ù¥÷Ó¸–å!iŠ—ûîB³S¶pƒ£D£G¥HDßzuŒ5}ÂŒ³•¹•s9— 8¦±äÓ|…Ûá¢Þ ™§ð= Þ¼Â*ŽNOa3‘܃¶öNÎÏbÊÚqߣ“;Ü>ð½øon÷~–2×=No܆½8ÐÉ/ðè¥ÀÇ:‰ÑAËodŠ+NÁ;Õû™¹òñŽ©áÐ ¸Óæ !´rlOµ2ì»>(Ñý×F—^ˆ£H´€é¼š;ÅöïsmCp˜:©ÅE"~‘mrö{zƒébÚðÜ¿ziʤõ¶´K0Ñ}Â7X;0„Oð 0y,_½84?T£°5»‘óå’ã “Ù:'­ [ëª:|Ê9¡6÷žâݵïW až‚8ïìa'•?X.\)kÐ:ÈÁlÔÄŸhÃål‰|ßþ"ÚN\ ¶~vtà6“.~ÄK@äWB«¬ˆçA(c›æë½võ5/ŠbhéÅá®ýÝ<¶ 1’î›S–1ãäW¥{r³c=c äŠÈñ<ºŽ˜)OO&ß"úYÜ?¤åÖ s: ÅAF–ëx„‘‰B@dX‘P˜¸ŠËÙÝP-LhOƒè˜¢ÔX·Ö?êèø™U½ª³hbrŽ«›±üJŸŸpï]˜ÿøXæËÏ|#<šYÒçw×?ÛÁ1¥hÜ:¼æ)m#À7Çn\†ù_¹Uß±g&ÒnI"þ×cœ&RŠCà=»ÃQmL æ3;U‹é#“‰:Ï)vç‘.NjÀU› 4T o¿S6nȆ*–âÕ÷â×)ºè™$i/C÷¬I¨Q˜bS³¿ø†#Çiáã½£=øWÁ í$„o-#Ú‰4(É Ôá¡Ôe',å(z×Ñxe_¸=òUÅ/þ‚™ñ|§ƒ^ºvÓÇõ¿ûA¯™nÇxðùDICn Ž„ŠV«B¸¶ 7×`lØõ"ëÝ9u´³‹9ñðÚJ‹_àÛ0ü² µå ¡v Ãg ± }$«¦c¹>@¦anïÌÔ†Å>Sá¶w§šüU6ÍÝ&UáÃÚ÷g¸^ã•Óµw1^©ƒöܽc9Éžgmën}¤Bssan—‡MÌä•‘úö”‰J×n)Zµ±à‘<ì¼ð¤ùô¥NÁÕ>Ng]Ï‹õ7o†ËýK,ÎÃP̹W¢ô„°XPåà‹5“ÉV¥éòéFüÜÎBÌK0†n‰cx¥Oè€ðô¬¸"&»@òËl˜©ªÒNûXªÄ& Ëd%`ñiZs(`f÷Þ§uüiòu-pŒè5_lÒÝ3»{ã DT¤²¥T¨ªíþÊryÍ5°Î†›lŸ|8öJ¢•;“×Õêÿ6 &#M^ÚE(GœO¶ @íÖñftZ0Ž˜z¤”2lbüb•Y,Ÿž¥°[flkm¾·¶ ¸4£³ÿIušî Ô!M©ÓAŽ/3(¾Ut†Fä‰(PÖ²çšj¾EÖÄ)ªëfL½7]…B‘†Lí¦ïëÃd€s¥¹ r½=¡Ó”Ä7!ŸTä&Ò ÿœ«Óo>ág­5ÄnòØ>í¾½W/;]ß®d/}¬a‡Ž ~8Ý] Ò_ümlŒn«d>/WN|Y'Êå¬á–"AݯP²XÄ_廥HviQ®†l¨×_{¼nÁ …*$é'<’eõÎm‘‹ïÊèIXJ­½¯àWâk!aº?vSÂí1Ô„ñ§ÜÄÓ£Tj©Hä×(çyÌT²24L®!©¸§è¯ôIï’pK×÷ÎëÊ73æ²®wxB¹× T*ʹ»Ý#þž3žS€G·êÑïm½Kv@iò}"b|AÓ r nŸ#°¼¥¾Å"vWï¸MªÔP­yÃÌ"Ü;°¾ÈˆÔ혿E¨§0Æí–‡®áI;e)p žÐÄÚpGµGvz¾zÄ×d¬¼åí!egÊK$Ž ïÄ :¶ÍùHëû•ÿ=\ÑT ãS]]VúI=ÖÎnûʼÀrzo¨žþ%í¥‡ºÆVS1ŸL’þ} UÖƒ©p¯tO@ôóg¡˜qñ›š Ù!HŒ§Q—Gxe9_&£[× C·3a˜ÆŠ”ÕÄY2 ëÚê‘)Zƒé ¡ÊNu"¤4>½¯>zË›rãÑ ~ó¯„ìÇ! n9ìû|€ÆÄ\8ùÜr;“]å_ÉCõ`÷¥±î ö2·ÉסgÛ9 ó2öö\Ù"m»’ÁM Õ%DõŽú¦Ì"ì\cä1úŽi½üof7ÆþàíŒx‰kšÐ®užÄDb”MV·#méADº©p7%D>–Ü®g¯Ÿ¡\©Q(O5eQíA¢Wò&ïÒ~¤cÍUi«£njçóÜÃÚ3ÿõˢǭ¶¾ÏÊÙ6è骹î‚É7íHƒu˜ÏŠÅ5âkóÛ-tÃÒ6?·óÆbs^ ìƒvÚ}ˆ[û¬¸ô"çéÈ¿ ‡ åŸE/íÝïOV"ÖZ'0†âÕSÝÆ´üWàåìÕw¿âYS¦“˜Ô/ÿ”YðÀ¹ŠÜÈýóK_–ÄVÝÒü“=n[ÙåùŒÃ•”'̨AÏæ¯8ݨû~´ïÁmlODLÚbcü¨5=<®KýD*QlÑh&ó£3½—|š°²½þÑ«¿lmÂ!ÒÎ&’(Çà\³Uhñ:•×þ3óSfRï…×áÓ^G&kz» ™0ØÉ~Û4Pv·­|v~eµ±…(,EÈî×È ªA¦Ö¼ÐÇñ­I~WµGW~Iç§v0—ÉÌFøu1 ¾<Ý’õ©–™ë‰æýñ¤ÃE1Ž.ÂøÏìT¦\Éì/–©7AÉâÊè•u\ãd‚zòSRV±,áYxïýödØ ]ÏÒPð_ÖQWdϨ¡s´sEMÉìV"I1ÁHJêx’†nOAÚÐ÷Z||€Ä~¿jŠ+ó+w“CtOdØáE(æ‘@ŸóÏøú¡ì$¹ˆ¼f£qª˜¸¢·‰±CÍ*´·g ”á8ÖS€üÎB˜€sº‰²j&O¡gî»wÄõã½ÐûÅ™§náŽÞõr/ÀwžçÂ0¢ÑD¹Ø¿hª/]ØdzuŠÎOz:°1­GmGZi¥ÂÐé²ñÌb %%_½ß¶¾{4®—~&ÉQ¾ýˆ1‘1ãY…TÂb¡I(®D§a×aêÙ³–¦´ïIa/^_–-æÆH|m2îQx’à~¹ÕÙ­n· À£bòå*WÒ¯MOGyn”MðZGðΰï¾+É:=2Á F¬#oy6 çÖä¤þ¤‡:æ±}Ð`¾Š„MI_þGIJ6Ó° Ñäìhª‡T+!W‚BðAê¢Èçcý Ö…x|ç&ce¶tºÖ“ç¾a%RÄ&­«2yÄR>‰çåºèÍŠh¦‚if…Ì›>«G\á¶i”*IìªâÅók¯Òîo¸ ¤ eçÔ$ÏBcØÄ¯ƒÞŽèÂAríÐu])ÂlŸI½³}{œ;¸ŒHw¿›ðAwä)ƒóÙÃË3øÙ-ȦÓFw?ÎsÂÃ÷ðìÉ&j“7`‹J‹±$ &€¡ …XÁGÁ²†æ‰0¯'xÝñoúwÈCÎ7TK+óò<½¤Ý¡08*”,1teÛ§²ÏtæÀŸî8äØÝ”Äáã„ ƒj¿ÕÅ;5ë"DÕ\y/5¦‡š±¿—ѱeL“qX¸r<6œ­Ôy‰«öÎߨaÍÃkŒQ %4qWb4êãaNŽˆ~3në$_i© t²½ÛºÊ+ë¹h˜²l´¥R|ÇìÜ$ùcäCetõ¶">-¸,áZ8ãÕ&{©¹°,~d"liÎ%MEílž›_Ï«ö*ê pÿp¦ë,"Ý>"­‹B>päç^ Pˆ1­D–ð‹.”LÎ|åuaƒÿJM£k Ï?r`ÁfK¤ªNã)×ÀoÚ Ÿ#¿aÝçÀ^hŠ«aÆ‘=*U5̺V3 ƒ^Ó>SO5 þ#ô%±kÛR/S Ö–èÑTC™_¥Ÿ¡“†îú©íߌE—sñK4™Øˆ÷—J-X-‹µ»cÆJ`Q"“'z´†ÂŠ•ú¤a×b£_úÚ¹=6òõ“09¢/ñ]ãN|Ìz  !#+æ. 9khƒ1*{w¥Ì ׿ì$¨dî`ºèܦ” XV*ÝJ8Bض]³Ë5ïRZÙ?Ç/Ú-Ù"":õ…¹VŒÃÎþ[F1Ê »´îZ{ÖK¬i‘'7MÃG”\b·¸'3Í.1…žEó´ñ¸AßââÔGX|÷cBg›™?F‘s£¶ßÊU)nGÆSíà;B/ZÛ Çš¬ ÌÃÛy À¹Ý÷ðx ³ªóQ¸2yþÉX1¢DP96(­(¤³ÅÃÕB"nQà ˜Æ—)LC³êfÛ/Ê¿ŒÑyÒ#ZÉ;úÎ3ú~®u64PÛ^¤ÀáY6 ‡/vÛTâÿ¤y µÈ•6‹+ SïÝW¤´kør16»\)qcZgúA>†\øi}vÎùä èë=¸÷¥{‘ƒ¯Æ¤+‰)z£Vߘjk]X²÷`jÄŠŒ@?q*Ú´%‘Ä*SáIüA‹Àö¤sV£ò™qFC˜³Ï­ëO´d™ýd§xUxn¡34¢¨Vr†O}ËdCE±´ Ï:Øäá¦)æM¯äJPŠÝþk³Ÿá›sÒ€EÚ $Ÿ¸£‘À^CàÝ[à”ºFÀ'ú4‰’šø¦‘Î½èU©¹:б[ÓFç©nzYÏy&?`XNGÄ;Fëºòúv¶iÙqqÍÉV‚®´¬L‘G•ÞŽBɘÚ-¹#ÿê}ÃÏz’ÚÍD ·¯‡óœé¹kx[@&ñ¯«7¨Ý若ωoj¾èÆ_NV}±ëîë-DqH4ZƒIvN”Œ´L¼f‘Z‚ þƒÏýáÚq6TøLQ«žš?µ|  ‚¦QEkºtb—œ’€ÈAû}¡@P¢ú§cÖŸnh’JÔÅ>ùz QKjåHŽ?O) s»‡­n¬S T‘Ë`Úù8yÚà9çpw3t|àÕ/UDNó7rMÆõZƒiØa%ã.ã­´©ü¢qŽÆ&{qžd_5>DíÜODcû×O¢|HÊ8)«CJÆó0äwýåcOtó ³ò@¿|‘Œ aøxý»‡JÆï­WzTN¡ ­ð?¥pŸ—-§ëÌZp·Xp™<ÊVÐoŠˆo8”ºS½ á + ¢è( Ë𞇶±×<*J›¼âƒK*¹*Oyâ</qßیc7šÜ‡Ø‚ðØçÏ?tÓ]‹öS&˜G2v¦?dß³§xNSb¤5à«K0P[4È”b¹ÑÝ$EªÃýgQKÎ’…LlSJçJc´fÈïÀÕhÖ1 ‡Ïvƻ˟“;üƒ’—sEÌÍm&Ö·}=ËŠá«á(u/YÑ‹ðaÖÄ}œ;¤5gªôy*Žû¹Ó^O´7Û**]´š]Ÿô.´™98xRP¡ &ÄXMª¥zÙ‘/n5JÞã½J˜Í­à®ñ,²,ÏË•ºþ6(^= [wã(=U÷C#LúùTpÞý³Øh†ÂQÁÈ}Ú¿ºæy¹ÐÔ,ÞØÊ¬çS¤Û+ÿâoôù‡ø¯±äÆHpN`¶TT¨Ï©HîrÔâàëÓ¼E/:¸Éš'Ç@ñàc¥1Ð’8DÍ7,A?ªÈŽY¾1ö¬ï%ä…×âý3e<´Q×=Ý€*‹†êǃPæNiÏ#ÉR¿ÖBèsåÜ­…•î'_»®'P%g}õtEm'jPsw¸°\G¶à˱ÛõLýÖŨQr$7[õÜrX’£Y%ÒtÑð×Sý²ÝZ·=/Bõ"ÝH…W˜…N´>­)F&"‘óz¨Ü n#™ê6w«­ÉvVýVV ßüR);p€SYõõ¯2i:?E§ä†W‹„.Ú\Ì òÊ}Ä3h#ï1u Œ¡ß±v‘@«*Ù&,#,f¢ßŠÐ|hÖ„md×ð#u­ˆÂ›w`fsš†G]ƒ[Qþ†r±ì?œ›Yˆ^">Ú/)Ë :›€þ¸ä•Bªß[ár½×ö]Öä†ÚƒÅg¡³¶ƒ ­‚h6Ïø+‘]ˆÚèÄ«³ìRI˜Q?£.¾Ï=q¨I™Bß^ ¢þÌ+ÿ™ í²^A2¢òØGºîlzÂÊ·“›Ú-?QNÈ2^æïM-A"ψd PáÀÅÜ@‹4ç^=ÿ½ÖÜÛË5dúr9£*À÷ë!ÎP÷*e¾úHÚpáµÌ°š¤NÀéAûßÁ/”Ü7©k§¿ï4Ïù•߬©0;$­7#µd“tà¶L~•þ&okF÷½=ÙwˆfúÛù[m”d‘>Áà`.vfÉê~¸öe¼;ËêñFÃëçOÓlüúdš²V¯´æ¨ åD„êìš’}¢!‹.€V…"zp½&žM‘ÙÚ³¼×ÑÏáàÝEí­Jƒ_£cÐR—ÖŸn]³ü[Hgeb§ÈrñRäƒX©—^¡Ñ~b&¦‹Hx¿êŒ$Á64~¹\í¦Qðáà,†\7{Øóýx_´Î<>qâÀbšdjNiú-ßb‚$w¬åޤÕw…éû§ÈçP’H$(6hÎ(ò!7•|:KÉôT­=qcÔªTXiÒ;ÿó#X·ÍÀÑçZõ°–}ßw¬}“`Ó­@EPýB SјÕÂ>JùI‹ëÔ¥‰˜Ì—Ü’n÷ÎÈ\š2lïnp@Y¦—r°Brl‡t`l¯.•[¹bïŠ*òè ŹŸŸÐ(µÏÍöi®D+”R¤k?.ÕîÃëŠõ¼ûÜi³/Jã÷sÄ4A¥Èfÿ€L·Ò½†p0ä¦ÔÂugÁ´!2!–éÓNT!à²ÅJ^ËIçºi\®M.O4­Åì”ê0tã/g1Ê®ÒZ•âØˆÃk7ÐÙk”ÍJ•Ll2þ(^k´xkqæ}%¶vU|úñšéÜ*¶óeÆHP«HùESÜ:ËŸv¼‘p…5/ÂaÜA…<³Àɽ;Ykx áË?iïëªÿ9GpYpÔdœÖqKj‚OU•}âxUƒ'²Êûñ™¤ÅÑ:^ä&ˆ;•Îh!Ÿ /ñÆÇLÃÓÁA™Í¾X|ƒ–†úµ˜)缟Ó+¯P`ôÚ1û 5††!-£dàéúKYÉ«÷ “\õy-‘b$ˆiB·Â0Q¸ô£kØa°}×ÀæAóÒU¯ s¢eñoVh”0”zÌ6«T8Ÿ×”ïÖÎ1÷HÅé%|èá®4R®_í\ÇšYÉ@ •¹{V:nè à4s­*óuc·D —F'l–ªlžÞ\“Ewt¼§àU¶ÿO’ü˜ü7eìð`­UØÅGé-J¶VQŸâRÆ"•çThÖ4|ÚåvEUqgÕäÄù¼¹”Õ9dNDªû¶»Dµœñ6ˆÏ0H]$.ñÛ¹«ºŽ$޲ 04¬zøÙ!²bÔ»ló(ñÑVI"#r ˜íÊFYm—^:V cOÖù÷swºH§Û7ïa B—ê{èŠ>6“÷ŒJ¦q`}n'f¶;æ—rÎT[Ýl­°øŠ÷ÿî2lÉ5DК’ÇùÒ5¡ø£*m"šZѶÎýò·hÊøó®E¡úàî´p]FÜëÁxëÿƒ)S endstream endobj 81 0 obj << /Length1 727 /Length2 13862 /Length3 0 /Length 14456 /Filter /FlateDecode >> stream xÚm¶spfo-tl;ycÛ¶m;olÛîØ¶mÛVÇf§cvŒï73wæÖ­úêü³±víµ×³Ÿs9±„ƒ½«š—#™ž™‰ *!¢ÅÌÆÆ`b`…%'u»Z9Ø‹»yš@3€*ÐÀÌ`abb†%ˆ:8z9[YXº¨L©ÿhØ›YÙY94lÜ­L-|îîîBî.n În ÿ©WK ÀÜÊUTÒ–VPI*¨$ö@gc[€’›‰­•)@ÎÊh落;8lÿãLìͬþÅÉ…áßìÝήÿ3wv°È‹« K(*¨ÄEÕDÆöf9©Êí]]xþAMM<ÿ5Àõ–­ñÿ,“ÿYÿË:{þÇb€ef˜Y™ºL€Vö°ŒÿÒMÚÞÜÀñŸ°™›ãSÿrù‡€ê ©f@óÐn¶¶ Æv@•¨ƒ£›+Ð ï`t¶ˆ8ØšÄ=]öf@³ÿ¢í¬l½þñÿ!íjüÂöÿ(ÈôŸ•‹„•'ÐLÉÊõÉÍmÿ‘êßqMàÎç_þSýO+À?çjæ`oëõþ3Ì¿Û1Š*ˆ©ˆ©Óþo þ·7u0³²·¨ºþ£¨±³ÙÿÿN+[ýg‡þKå¿;`þ¿¾¼±«³•'@—‰á_KÂô¯ç¿–þÿE‰ˆ8xúг0sèY™9Ìì,nfv¿ÿ‡®©›³3ÐÞõß²ÿ3Ëý¯è 4…ÝXu0å µNo ¯ô/^¨‚ ]˜3R§]e]›í»ÑE±±43<¾Â½WÃ-ð€'˜2á߿ܓ¾o%1ŽÂÿžž‰!ŽÔ_Å})%­²ð¯ÛyS.|mŒ4¸þ¡cgªðã&êÎ5ss#X‰f†-;ï¼NÆ©œE’9ƨ¢ky7aý×£½$µ>%j–Î<ð¶yÁ2¬èÚDðå`,¢ dþ†Çв¨2Èñ8B§àðѸ ó|‹%”ÖdÜþÃXðÄ–3Ú »A+[àDDM³Žö‹:˜«4_kÊ똅¤¸X«¡Ûµ7^®nž’¸ql’‰—Æ­G{lÿÑ„³{¤³›ÛÕ^íŽmÖßVä¯+‚Ï2w¬‘F¶ÁÍÒBññ¦wÉ&ÆÍ·VŸ³BÒåràš´SݾÇhs eÐþ¹õÍz×z"¡á䇈¬û”si‚y)½ ‚’lpJUô)Ù?s Ÿ|­–ˆä18NÒ9…š+a!ÑР-F´íukvÔýóÌÝÑô™zlñ+¢Y¤|#'ö¸›yé£Kú&žÖ( £œéM‡þr–Q×Ë·öÅÜ@±2a% ãÝ8¿ƒ…Y Ê¬©®Ð2dÈêãG1ö߇F¿”i$œ5²ۢʫi@À\{¹ _Ä3DÁ]éGi]\î¸ aþ(…r ‘`ù¦$@êF7œItU%¸A†ÈèÞ– ]7‚æÎ2a`­™¼—D”°ˆ~¼¡N|•‰³ÇB,ye¤øK6f³rÌ3æØlo¾ªÃ¨ñƒYúît •>÷†È º$ýºKà·™²uàüy9dE Ì7¹;3äK5s‚’®oç¢àhÃg6R‰‚çWS<Å’z˾ÛÉefÖƒÉð³I" Fs,U¿§÷Ï`ƒžF>~ºâp«¿8IöOD‡l’h{”f³PFHúdµ³¤Z‰ôF(W¥×qr?¨Ü_%žb¾°—,¤ƒâyœ¡Ú7Ú{Í퓤+pˆrÚøé×—hÆZSkd/$CŽ1„¤¥!šïT’ƒ¢#ÓôªB}48¢Àܵ5€•gÝèOîXí’|ÊsŸ=<•n5ð‘“ó…å;£:%er°ßX:¼ Ì Óñ„CÖ5³ï–1|²Ñ« Û åæeH¦é?O5O¿1†àËÅ^‰ñ2¢DwXdÔÉìÞDù=hž5iDZsj^ðÙ!–‡i¡¹Aïö¹¬›ÐWq”q‚K×/®<(ê>¨oâÌ" xó‡ëJ‰EBU Á<¢J_~Π=4‡õÌèX~PÁ”%h0x¹%ŽÓ« gYä0ån˜Þ5sV /Ý‘›°°pÚJèL~ü CíFÉø…pS ÉÚ´\˜WöÜ·ÓpÞ:Ž.º¬]oòtî]…b N °¼g¿Àu1äÌôA T'È”.%&ýÍJcšû“˜^ª…gÍwRÃUkAå…þl¬ =!>~ŠH¹êV“ýÈ+fíF²ÂYQ^èÜËUúj4Ô)Ù‰ÞÞ¯"Çâ$º_“ÔÍÈ:R¸"ÏÓÖÖ'ð²g¨Z=„âÁÇYÝÛ¡yÍ£wZ"û@_ÛÞ;æ~ˆð`T$P *t½õ\­ÍÊ™Eèê ü>¢{ÌÖ€.ó9ì/ÌãZì>2!FµÊòÉùš9¯«à –¸³â®º‹¸­º¬õ rÒrŠÑP©åÊÚ‡]ÇçʃE?îÙNd¶0)>·ÖûJOf8ø¨„”»ô¾@›Ü·\¯gnl$”ôÝ–ÜÑÚ<áINÌ,‘^}ò…û´)–4•øÀ=ÙÉegº~¤˜AÞÛÁš]ç,­.“­µºê}_‘À.óÑé…YÔæ½ s¬§é̾h£|}¹¼Žu”6pk¹]Bw É\Ý€·d¥ÝÎæ˜ƒÄ”ÞÄ/Év]Á‘)SÄßPe`&H†]Bª—†yñ;£²Ôm"¯…^¨4#™QpOv¾–àÕ!ø{FXÜNžwÔÅöz’5†Ä¥Äû—ü·ræ÷äÛÑS –§^¶V éW—­™rÏ_챆o®t4$祫è·ÃX K¬”(¾´— ðöñ‹¾ Ê•¾Át¼wÍKi÷û[%·d§ëÉ)?…ÈûIdXáxÜvæð×à‹áÈ­ÃŒØúÆ©l¤ßR]zÜÞwíÏÄ}ueù 'éŬ„ê“…f †K9fÐ3í¢30X²Ù¦£è&Ø T ÒØ–ÃñÜN&M|?9C%'º¹Ç(×ÐX¸à\Ç.â‡(»„ÆL<æšâQSÙzyéX$¦èÐ}ADÒz¨KUO;zB yP"’%¸ê—X¯vXLŒ»$=üè «énTöirù O©m²·n„fÁŸ(„òÇ}Kdµ{$J+_<+åº]”½IÐËs‚ZKã»eÌ-YinP0¯0c²e¾,i}ˆú±å=d¯ÅQ‹ŽM„ëŒùw=’MŒ"9j¦š¡¶öÈö¹¥ Ùš¾;¿~ ˆÚˆŸ«@ì\ñ²:GèŽk”\Vÿ‘¹ô¨r ÈÓ§!bm˜î°rq-7†DàgÆ‘2xžçmïÜmcG8‹§ '”íZ]GÅB¦ñ)Ç™™E‚+ä•L™•çuñÈÝlÛ\l³Ó˜‹ÛV­“gì/Ø|o(ñ,ÅÖÔ"clc³š·ò´ÕÊk7ßûº´§}Š ìŠy\ïÕµÚÈJýö  ¹Îúûn5f&»«ZcÕþIgaÜ l¶:IEž=“íH‡:C’Ÿ?ÔÉdÇ$WN ÍûD~gþ]Ë©©å@x¹ë^¯ó,Pïhº7Ç[g `gÓ‰Ûo¸Ép¸ ²¦iÁV^ù\‰%½{ôuÊ7“3Ç€½Bͯ^‹ ±C$µB›óœ¸ªv\sžFfé"ùœPÓ»‘ˆÁaÖž43~y›+ÏCŸxŒ'x¶8…äQâÛ~%x‰ãõÆŸ»ezû¼©œÝ)MLò2/ç82Aëº …—&”˜OÁÕ ¼XùZŒÊÄÓte l´RÂUÞ‰2j)/2Jß5yÑÜsEµßn»üÇ¥eÅÀ+±jä‚â ÁïÜ90ÞQ™­ô¤•ÊCúº@{ªê©}žÂïíùîÃhÔXž¥z=÷i2mgžLåbëjÃóNÆf¢ô"òÜõï ‡*T¸ÛxMø½Ið/äц¥±}dÕ¦Šàª¡4x¨èâæâ&VÚÿӨũkG­z¢)s‰V†ÄG¶nEE½lÌî'Sh(‘þà«!/cÚ¶ùM;ÞÊrÜÞŸ0-ìNq„Þ‡0sŸ¸8ÿqšOŸ1^¾Í§gO÷« ‡íó›A6ìC©æðµsi)M77ÆPDLt<ͦ~”†¯³"Y¦‚Zh«…æÒBÌMÚYYÔ[Ųa ?|(ˆ¼i oÙa÷Š8¤™?Õ¯E+¥+ËÝ'ìN”ƒZ¬“¶+ã¹¶‹œ}Y…pm‘%ÙÏÏJþ'yTÀ)NRמeI£³²jkܯsþhlCË'¡Ð?,d«÷ˆîS#fà×Ù«ô4ŠnX³S“³¼¶²t@ãû¥§1Q r O¾%JT™§[d’uhq¡LLjIÄm}JåÇ…è)\©NoA[j~yÄ ƒd§‘‚~š–%PýÂöç£ÒAÎ µØô3‹Ó)5ìYjÚØ|{~Ñ‚Ì\þóÜ{QØoJ¹µ{-¶FÐÅN ^¬KH“¶ZF]ŽëAts ·Ã+»¤EŠºæßht«çy WJ5Ý˾8‹¶‡b‘àô‚LÓLtø¤„fóOþœ¦ÁÐ1"µ¦R£Ò^f²œÂU“ÅŠ´”‰}Rê-ߟŸà0O‚Ã!ŒŽì½½âGX„œNûR´7n0³⺫yÔmM*¾úè 9o½Â÷ ÌISuÑèZ–ó—-)ûÖÊ\ÉH$æ¥ûµ(?¶>4åÍ­?¥ÎN8ëˆó JM¯çQåQEZP‡£Høø\Ào ¹K¸«W~çõš!<ÿ¹`ÛšÒòåüuƒ*n‹bõé“úäÑ]§)j@EM#-©mF+þÍ™Î.¯Ûø€s+PƒÆˆ%㨈èÁ3ݾÝy޾°!µ87ÂyàØí˜ÒéL¶;ÓzGb¡=~c.Dàú{sW8§Ü—à ĀC> ÉIqï'%*˜LIen¦•©áŠCoܦmÎÕ÷A= £¸¶ùTϱia B!é#ÜŒ2âÙÛ¬ëÜYVÞçðé6æŠoqCÇÃq®ˆ=û›ÜNÙ—@ݶ¾ØfÂÉI*4¢áɤí¨JR‘+)zA8h–æÁD–wbÔå£FÛ‹ÉR¸ßÖMn4šØjɲ¼dlnû5'ÜäŒvSùR›ëœ–%ïsuAÙšCxm»o©|cŠÂÌofÍ8Ë(v‘õiˆBB éGÆ·pênù&Ö±Íàåª$þ‰ýE¯Œ Ç_Ä_ˆAŽp¨ÙæYß Ûžü¿qðd ¯Â5nSwGކåÚ™²®Ê: Å&¤„Y·¸k¶ÛO m• ¹¦êÜ^žR„é"羚ëªsHCÓõ„OÅ:#“ÛqX3·ˆ÷þùÕr\!‹±õˆR|®Pb´ÕƵ[,¤&¡= ˆ?WaþÈ•óURD¥²ôÈk©õÿÞX>+þi•bR.?ÄXoF)ÂïEh Ae×6a÷7Õ?©Ø»® Ѿ͕MwïÑ–žƒÊå¾e×⯞¥+œƒÐ«=p+[„BI¨'«:&tOWLÖ}ȢΆÙ¶Ÿ:PLí(™…òN6­êðƒø]?RÖ]oN§q*ºh¡87­bçôŒV ÁÝÑfsx©&â¥t׫ M.j47Î1ÔElG×v8Þõ°Ò÷­aµdÞëe]ØÏg§âÄéxf?&ѵRz Y¢q:ì1³–Ÿ¦p‡D\¤ˆzå! G×sàÑœ).0¹3(ºfiâ²1ßþ¥T·/ð]êE¤ÏY½páËXÜpØÑ`ÿç6~£¯ò²·T¹ÈiW¹öú1¤ã¨îôŽ&ŽÝ÷¾âÖÀÕ¹Ú¢œˆJ»Cv¸­(yž¡rÃI’š6€!ÆÀ¶SºOþahñI:"“ÄÍ’ @6´ý (%þLìS `IÝ”ûE‹B¢ÐD=ÆÌrâ“Æw,ñÁ;[®‘ÎGoq¯éWVÀ(“Ú¬¢÷¬·†Àg °~!’eѶ€x]?¯@,¾¶±Öós¾`v¤/îš'4|?WœìBº"]€YâòÿS6ÝÒx@@‡Ë*¸nBùÃêÑ»¶et›î›WÅk „b(y{x¼¢´ë’ð°÷„×åDäϵBƒ:úÌÇc^UuÆ\°µd›­Zб™O3®Ñ²É@úL™[g…?ðYRbnôjsV÷9;›jÿ[œš«†³ç>ó«ØžÓ}ߣãÕ&!.TäóÁÁ3)97û:Ò±‹Sä] ‹ìÎH2¿Ÿá…h¤…¨rŸV3”îÌ9§5©zŽÖÆ ÿêœW«¾›Œö]â&ÉhB_­ºTM´G¦óˆy¡€@õJ&f:øFG»7|rWÐTžž{åÉ©|™Ï›ÛI%mV›»É2º«¯í!ð8ýËÿ´ƒÌžjÊ!Ŭ˜»µÞHˆ/—¸ÇŸ ±Y¹*馪Ñc$ œÓ"ÜBœ)â,ÄÆõçcr¼RÕ¦Dnû6׆ }¥^¿}, ‰êóLO›dj"N³~‰Z èCÙ« ݆ѴAë„79 Áj;¯ïz7´íÏd‰5 —²îüñP«èb5Îûs:$¨Å?ûN±QvÞ)¤Û3lE¶íØhåÁèÓÏÇ÷WL|Þ×[¶¹> è{ÚßÎaÆdìþ5“üE÷üÐöGqjÄqÔAîÙFhÃÙ¨­}@ÔÞH¿Bö&üa©½¬÷ tËíÕý.¼£DX"wëL6(©íD}BË}«*Aº¢ÆááQÈyû@þ¸·SO®Ëv›¯p³t@™Äte³¦)ö öÖ±7sFg!¦ñÒö»ç­ODîÄ‚Œô‚/0šÞ\fa@®8–™*Ö¡ØiVh\tžç:ä…=;Þ;*^U`w WýZú’£:Š$Éu!ßm­úéVò—R~º×ßý§aÒ„ð}úÕª„c‡ê‘ÆÖ’•§Øþ[ÄŠ±³«¥¬—5ú•oPÄÛ°*mZ²øËÊ„éòbÑX)!JlÑ*´ß ësï%º7=ZQ'\AVµo‰ðùÄèLõ_›SéÉÈ úëœðØ(ýù–]»ÍiÚ;åe–Ч™[6;bõªØžçÐã}êAáÑàXé=Î=ÒÐÙ6`îÂÔîàð°ÙËû¹} DOŒëÂÝrõ=>펽’â&"¦‘oÎØÑÑ/Ý 6šR¿¤ä­"Ô3«ê7)xêîñr¥3ÜÎb ÏóÐ;¡†Œ ìbã†ôè%ÝbZiþPm»ÌÖ`Ãä®·OÀô¸P7YÖÕz2ï¢-—êèo2È—Û¹ˆ’yò‡ÑÝ*«ªÉý¤ÜÈØÖ3pŽ»!•¤¢OTük€Eq;BS\ÿeò+˜¤b„J± ïqE1#â%¯t¥eQ«–OùŒ±FÇÞ«B i÷¹X²Y´K¼`Lîþµê¦†û‰zCÕrÒ‡Í7qj.¯ÁÁ¦·gùë¥8ÅðÈmXAµï#(Fˆ¯aeB…À4â¨Ô»‚S»3Ûkn÷X6ÆÆ˜*Óƒsš«êGopýCÁ¨Zí¨ë®çŒví×õl'ÝÖþròÊÄ€­ÍÝn`™…Î#èq^ú^â)Õ¦ÀNÓo‹Ÿ4ôbӶ΂² kÉx¼ÉÚBÙ\>øn~oÙ†#gÛMCUŒ+[Ïöwæ/'EŽõ+ôºÀP O¾Y˪ÿ=žÝüïÚ¤d\0?U¸”cñ›Ý8pêP tÆU[ö ìä[ÖÐxÂjŠk]]qDu&w´YO¢à­váU¯¿®™eFmîF`Z»8(†Úl“HpL³ÃÔèL?Ò\Ù¿ès&WÕ¡B?ýe=ÆëuHʰ=ycÌô‚¥ÂUÎ HÁù*Ã*¶¸ø1d[Š©k.ά±ù>xd“/ðc$»6 ` ROw úQ[û­<ˆ:‡Mö‘Êàv]ö:FP½?Õ‹Ÿ¸Ú¶¢S¯ÕðÄ]ß+A¦' ÖÑã,S;‡c#Ž}^³¸)÷A Ÿ c}.Päxîà«7xn ÁEPïÉ·ÈÀú ³ÚžÔ¬Úâqšé< ƒÌ`2Öô +í¹.0ë=$&-§4/¤cqh^,)1lÅØák%¾¼iè Ë(°ï‰†kÆ-n”"ŸØAµŠ\®²É>¡è´3ëÛ0pAåC>´G&ák3t@Èà =O_Îát(F ·ô'ÕáÁ(û¯F"Ø™Q|?6œñPÅtÏÞ<õqâ î:M“ueÛ¶»Ëâ®Dóh߸E•V¦+=¼1Ƙå*É›T£¡Ú¯š¨ïÔ¨fhýÒ仲äÍéŒ^û¾FSñ|QÔ­¤Èâ¬Ê¹ÍÈî“Ó{†ÐŸ‰±ÁNT#L7¹•iÓ;ÔÓÉÕ¦žOJ;ízIm#Nå++‡fG5xÍÛ)µÈؽóÖ÷(¿ÅÀ×Ü”€Þ‹˜Ï² e¤x—°Õ¼#ÎØkî> W] ’‡{a®#–]bbMú .‹ PRH\hž®]¨m}ÉìT"«S‰¨»¥Î ÷7»ŠûÙN»—æ‹àBÊ¥šûÅ@†ÐØVå¶.‡a³Gz"¨?Š\{©þÍÀSòÏ8lšu!{Ó°ÜnpLi¡ÏX°Wƒ°v:Ò_ý”ÚïoJE›¿(|•ó.\e×jõÆ›uöõ1QPU=&ûÍ,øME/Šÿ¦’_~’t"BÝ<ן:€Z5¶Zï+’¾ö!×X|)ÿNûÓ¦H©Cë´— AH\ÂïàÝŠ©JMúN362ˆ´’)/è÷’•ú½Œ“ '¾ð5Dñ—ËxëK¸n‚œ‹î¹§òÛT;% pº_lI!ú3en8µ.Ã^á(ëåÁEx/‡?åsD¾À£T¥Q_¹Q 2q¼ ùÖ¼Öþy4À>‘Ìz¦pùË“µ¸q#}§½×ü’Á®wžìÞâÈ4ÛÈc™Ä.”<²UüxS® Á-ewgŸxãQåjxû=fÉ£k—¿Œ‘„7yœö…U¢â?ʬ¼ Ë“­¦¡ìò®‘¾è>Ð=2©{¯i0³«Ô«£UrøµN¹ž>¡¡ˆVvý' ¤Õ jwôS¦âïƒ šŒþMHç=’ŽÃ.Aÿ’ð:Ž0oH²¤ÕpØøµg|EÞ˜Áj¤µÒÒ%RKJ{«tK´rÃî~‘Œ5ÚùÝ·Bºn¹I°SVÂý8Õ^÷òRñ­ðÆPgDteÿÌ•±¼k»œÇÌð½# ’á—Ðnå:tø¯ÐM%JGM:ÍÑÐvlUß§9<¨*‡ÚÌ^œ‘ÙÌ6z}öJÿã½}_øPœž—š}e¬wY„OÜ5Š>¦ó¸ÈØbëTµY´2ÏÈL½¥Ã Á_Û^3ùÍë>åk¶ApϪÈvZ=û»ïµÍRðzÏ –Èì´¾†}tJ5!é¯oŸ÷zˆò庞ŸÎœË”eb½ËH`'$vv™I·½?ÕÅ.Ý<¾&©ß'lnœ á67sBLteÅn^Žö¿I"ëRfã{°¼F¯¹›á(Ôbµ!ÑùÁræ F”»†Üñ´¾e$7uÿz½H&ÂuÙ>CÔÐ[ú„þE¤ö¹/1¢Q(89WuÉB§/;(áã'÷öþöÏÚ¾ÖÁÝa T‹™HÓ0²‡ºlXôÀ6À Ñhëòïˆ0‰vÅDñ·P)¿X¨ û*|ÓkëOÉÁ¤ø‘[;( Hõivº¢òÄÕPqÓH5¡ìÜ©•1³1ÿ ƒÒ†ÒPäFºÀ•`Á#uᎱò]Ç›•K™„y\(‹¨£ ~ë¡KÞi¦(¢Ç±<>#¦n&o¡yH.Ú+²èi±3"<Óò–  D~¢’׈þI¶\eêž@˜™`“™:¤~ŒÏ éï-ßä̹O±ÞÔ}eÉ»•f5q–¯Sn’h·Ö"= ¾;ÍSiغöðp¿@›cñÃ7g©Å]9¬È¤J‚ªbhËÑrËdßœìWRClþ{U ÛßÙìPèï¢ÏJÊìû‘•Ätç_ÒÁá¿‹»ÐŽ66··=Ùz=Ö¤NÑ[¶`¬ÝÈÓ#Ì„&[p’zUf6Ù„PXÕæ¸Å32o»&ãå\ò‚…öÉBÂ*–B4‰èƶ¬yþ­(QN‚o¬r©÷­Cn—6¿ÿ˜ac ÚÅç|KʼÓyäg4× i.Äʱ„¢Ýsxp™tm0)= y¦øuú AñhGë ±†®ªR×6¡ùr§]>˜[nG±rûÑo Þ±€~QZo¾2R¹<`ƒ`Oàô\•ò~6;–4Ç zøïÙÁ1"   Ô“v' \×â|Ñ­0øWê{×Ã9“9SBÍp$Ëž »·Fi®G'Ý®¢)\6ú £«+]‡Ï^ÀT¦ÙX·-Õé2»» †?56«‰vަ½ä>z;Þé;›“V%c d§XB!ñ›{¥¹o½“«H¦³}k@\ yZw)ßêù\âWíj? ½MG¸Û¤ïWŽßµ×ù{¥Fìïc Uðú/G±À.¹Ñ? >Á(K¨Ôl0²_×dŸ”g[XDzï'ù®«Ä*†Þ£õ7Nlq®®‹·š†ÅCiDké`ÛôQ,µleˆ×¾†dÖ¶¾-ušª§ÂøRÕÝùû°OûQÄ7(ÅÄ_/KŒ™'ھ͵A¢Æõh,º²J9é¥Lmmi ýÉ7¡#$ µ÷ʵô¿âó<–ûÇæÆ7çÓ¿Lknº®§^,e„ȆP³î^Ϥ¹‘!\Áÿ&춦I‭ENÏn)Ý1YŠÞ@ÿA§ž¥urì¹Á¬ýó<…©º´¥P«U“x€ t Ÿn›„}±7Û—^ž× ›%“MÍ·{îôZ­í.Ïè*yãxû9”Ï å’´^WÂi³è#ñ5et'Ä~:¼´CÏûÖ pCÄÞÏý:â‚]V×öã®-²Z¸Ú®EjÈ_“•%/ x• ½`ÌŸb 5lZ°S1ƒ´ûÁM•“‰`5@"€j7¦|A zºÙQÅmèi»R×9à:r% Í8‰Í™_ IOU‘Æ7Å€”˜fUHÅY%Å,¼‘°Oç Ï7®ß‘F›ˆét4á¬4yQç¨g=A¦üå…Û t(LvìRlÃ`Â{ŸR5ún·{¼­¾ù×9Fž9d–µ‰Wüõ¦Â°ö¬Ä.™~sP*ßµ´´yîzèP%ù›Wæ—Æ^E!d;x¡“½× ”O¹$WR¦ô|D„!y~'F¿­KHóW¿,Wç±&:áIʶԓnÜð¡?éz4è4i„1fx¤*×߆¬_1)äpɸf½Éå*8§(ÖSÉ•éä°ssAöÐ%ßæ³žU!iVGTZ™{äB* ‡õc \j´TX8ª•GS[‚(}&ÑÖl—0ç×™udõ—19Fpùòðo**ï¼±‰œˆºTâ“DNë=mgrV‹4Ü#4^µÝT,V÷‰ÿfkª‘ʽfXh2¼´)Ž[RÙôu‰XÊ’+àÒÝV–5ú]ô|¢ ?Çzt‹T…øÅKšLãœüá“p¸s‚‰ë=âýœ|è3ßP ª¾”{ ù9M€ýã ³ŸUåüwò¦é*<{DãUúÚzM˜¸C¬~Ù5`ÿ×Gi\LS†Yê¾l7á ‹õ» W\pªýùë,3ô#7ñ‘ßüЦ¹¤+È[?A(rî¯}öÕ«ðR:»¦| º¦>Ęr’’¦Ýr™Q¡•Ù+¦m²±\­ YÅ9ãøþ|+ëC©}{Kp[Ú6¨Åîƒù¨ý9IïWÞÖ”d¤T½é†ªì%iò5>OE+OÚ¾Pi»v›+‰ó˜cP– ‰^3R¤ºÛÜÍîZåÊ…,_žý„æ¹_/{V—Ú$!óçc(r`*ï øÃÈvîÉžš0Å¿øä@ ç\êa¦Ò‘ȱÎZ|¼ôt­J0S n¤ý]÷œ˜}b{Ìt[>ؽ9^yh‚¢“â”Ö.®™ûµ§ÔEÂp OpÝmb 7ŸPf;Zž¥~†ãUd9Ç©²MŠm õ‡Æ¢rÝØý§ge¥;÷~Ù·èö‹‚z@æ/è|·{ÕEç<Ú‹‹4è×)¶÷²|ÐRW¥c:Hu\iâöµ–ž÷¥wZc±îiâ–ÉÛÐ\5Å_Ö÷Q%P—YÓ³|›Œ* Å_Aé‚ E)½ÓCpšü‘Úú†5@noû&æÎ¡ÏJªMù _5Ì.Š^3¶d±UXµÒÅ @j6mT`dµíiõZZg n¼rQûäKôÃèV$9f‹Iå饘Þó½R™›‰ðžÓpºL8Ý­dLE1¼jý¡¢±òØOÆOŒ œcø»k.©ÕJú º"‘öIõ£¾Üîñb£øib0¸/|Qp$¡È¼Ò±1•ÛÃjÇ9–~­6+OkªÉžÖñ¯yàaÕzG¹nlBûVeäѤ1ý0¿iÅtZöz~a½! ²ò¤›ùG2n÷9ûñ /”V(˜2¤·ºü…ßóorccðe2>×ÞÞ“¿}Eà¦7ý¦°Ï›‰áÕêc­øê² Ý2­Dx/´ñØP‰óȇ˯xb‡(¬¦sê_smþ„.y4 —¯óPVXˆƒ ±K´?³<¨\ÅË[1}á¾KjL‰AþpóŸ§_°Á9»Á¶Ô‰1º×n3·Ù¥GÓ<‚ œ³¼6èï΋›¢PXÔð GÏ^,¢šÂR€ké~Ù\2#ã?YÙ|˜Ä„–*Óp7 ïœ*YòÚÞ¸Ð,›¥7Y ßls¤/Èæ[ÕxtLv#c‚j‘Mî\v0HõÎDb‘´ùœOÉéûí^Ôë«?ã%ä4q34àä×cŽ«”ú|,*×Ò놩4Ðå”Wd¡Û`ÏTŠ(T‘4r#î”,g(àМ~JC“[šûð*§‰¦xlÁýI.<^'K‹Kjœ\9]·†žDÖæ8ÿtZyÌ„Š±øÑG3þFvX#‘q«ÞJ£‹ã¤[à¾úèÛêqÿìþàSð{8G.3M.XTS[©œ€V1Z:pG?®ç£°S}ôä;û‚ S']a­tÑ¿³ÈÆ–þkåö”k)»žœÔ—JktÓ'Bƒ-4C](Ô=±`ÅRøe|i6`8çõ›p[[;Û{"ŽÔ‰@Çñ'Ÿàt4äâØPi,lFãb‘oÉڲ)>•éˆ  Ú.ä#…Þá “q¢ÔŸºPLOÑhéOÃÈAGM^:xaD¼ãç…P­¿R[3ÉÉW :ZÍ}U¡xj²v‹»{íežÁ(÷ÿV\æ¨ endstream endobj 83 0 obj << /Length1 721 /Length2 17697 /Length3 0 /Length 18254 /Filter /FlateDecode >> stream xÚl¹spoÍÖ-;Ù±wò‹mÛ¶mÛ¶m[;¶mÛ¶µcû{Î9÷¼·Þ[_­&FW9zÖZÝ«IDíl•=ìMhhé9J¢Š2ôôôzZ&!Gg ;[agN€š‰1@ÉÄÀÀ`¤§g€!ÙÙ{8Z˜™;È(þ¨Z[ØX8Tí¬í\-ŒÌÜ®®®ü®N.´Ž.¼´ÿ R218››L-¬MBrò²br1Y€˜‰­‰£5@ÞÅÐÚ madbëdB0µsXÿÇÙÙ[ü‹“í¿ Øºš8:ÿCÌÔÑÎ #¢, *'« ¢SؤÅÿnëìÄùÚÄÈÑæ_ÕQœÿDz6øËð¬ÿÉ:ºÿÇ¢…a`[9 MÌ,laèþ¥›„­©€õ?acûÿ¦þ!äô?ù?RŒMLÿA»X[Ëؘȅìlì]œM2vÆ&޶E;Ûÿ¢ l,¬=þqÿ!álð¶fÿ(GÿŸ…“¨…»‰±¼…ó?R›Xÿ#Ñ¿ãj&ÿYc ›ÿŒ7ùGVÔØÎÖÚãÿLùOÿžNAE^UE‘êàßi[#;c [3€’ó?Z8ÿOàßiy‹ÿtÏÉü·› ÿ×—1pv´phÑÓþ«=èÿõü×Òù¿(AA;w/V ##€…žÀÁÄæó¿è¹8:šØ:ÿ[ðjù¯ÿïF21q71‚Y_±3â ¶Lk -÷)š«§š›ÑW¡Za^î¹ÑB²27Ö;ºÂ¾WÆÎwƒû=`ȳ÷wW⾙РÎîdr*š \gûµ˜¨ÂÌ·fû]¡à­>\÷LËÆHì&âÎ9cc=PžrŠ9+÷¢FÒ¡”IŒ!Z¿¬£q'~mñÑVŒB‡ 9SóÎ䀪qÎ<¤ðÚïu$,?hî†Kϼ°<Àþ(LãÞì› Vm×ж×iÁ-SÒJ”òäë8,‚ãOøý7br©É4ñÆ’çâ,ó©}ô­­oïgÏ“†2¢-AÄ#æ¼ç2â•–¥blH§Þ¯'ÊÃJHÆ[+£ƒ¨¶@Š=ÑÇŸH«îÀ]J,?ZÒ  e 1’‚ ²LVqߊý*êÄì­cHÂwk kR<÷•‘Ê?í„UÁ°ü{`Ô_1©Î¥Uê:Ü]ŽSmÄoû3ÝP5›œ€µ«^*×ënkÊÈä–º°ÂK02BlÅìÑ”V¬'j6ª¶åžýÅóOâìÑÕäZ`'wÏs&ò¡Kœó½– Æ(À;êK”É£†„0°÷…V—>hh‡(ÉFÔ- x*Dïº=UÛ°0ý=ºJ»R@«}¯¦5y†\ 1„tŒîch\áñïÍvüЛQ86 ´Z™<üó[vA¡x¯#Q¬?áqþ硸qÇj wè–YÑ<99,PZ¸ýK—Õa”o´5ͽƒ'ä”éLÁ¸~í9Ò/€œË:GÛÎÕŸŒw…¯¡ašæx?¯DdO)Ù SÙŒÐ\òz¦(Íx¨=£ìíD•ËÁLŒ’btµ½ˆ /^f öî¯ã_OaÁIæà¾_¾B»M· †C<¥(¥ŠIäÃÁoj¬È6’¥øX?í²H[EçŠâµQH%¾|j•Ç¡½d"YáΑꩌÕÔ£8naÚ•ž*3M£È]Ì×ìÌ|·¡ÌNF¡Â”¸3ã³ÅAŒØÄ4üÍV­rêÏu­W4±`c#CÌ…ÉÇøš±&ÃFМ~R1 »¼U(P¹âex´2NXþPЉ歜¿@M‘é]¬ˆ#³¡­”׸?+œLª(MÞÓÉ„G·¿".“>§°‰ËtËVuÏW1ÈŽéÈJôo¶ß×Ìë äˆyÕˆS¦Ý‰÷†rÛtè“4Ý]E¼*B¼[惗©s5ƒIðA%)T«ù’ Bê¡<×UÄ ƒ^}.óV”oœÓ=Máòí[½úÙŽ9¯?F®:Ö­›beÍžÖJ^u‘$áÇ|“zÉÈ´…G‹"ž¯'èöÞSûŽK³õÞO•¼Ï9£ë}ôiºÈqJíLTž÷›‰Nz½V¥>¬¿-C†¯Qó°pË€nŒ”VÛ)—$y„(Ý7)¡’WµììªÝŸšÎޝÀH½ q˜©ž jOU™fÕH1MÈ©E ÒAÆv2¢ W˜=¾tßWNYÚÄÉu::W2Û]¤Tõ×+%’uNa's¶ºÏ4"Ï‹ÈL„­§zÈ?eëßRé=ähÏË4±ŒIodUeþ®$¦UªªS¦Ò¬wçÓ÷USI˜ž4á#¾¿éùìþÚ×}oCÐqU&S#ÏÚEsÝ5tÙjlŸÀSq†µ”Ü|üÙe²%!ÈW\Ò:84hÈH=mŒ0 þ€Ç…°æÍWb²Ð:h¨0XUÊY‹Å4pŞäÚ‡!2§÷ö~9v¤¼3öP¢ÊL¥®Ó)®4+ å¡´ód)86q'›Ïû°lvõôžò­GBRÈÕä“|Rg³x“â–Yü¤:Nõh§Ôj! Æ—Tȧ2ÛAdÑÚ¶„ñ–ûP™g Îìúì¡§^³¸«T]æðÓƒ¦ás…³òWÖZ9´• xË?T޲Œ,tƒPÂ1SïÊgQ¿èW’øÇfÿa‹{œá×軟Á· nÒð݌рA¡¥ÞÌs©÷¢C?âÓ%¼ªbÒ`:Pzï‘-‹²ñr8¦@­0¢ø…8»ü €_,U“NžšD#¯­fßÕ±›@¤ÀÖî¦Õ¢ŠÛÆ’†*Ãð÷™y¢£ÓÛªìæod¿ÐW-ÝoT¬xX‹F/úãÓ5ŒJv„0:”¦€®ÐïêÈý9ž$òÖóÑìE%¾ `Z™øÐÞ‚Ü-ƒ¾#F6úÅyïÜ3C™DïèžcfwK.Ž 6¶‹ •æ2[¾(9…êÁò_ w_)•TÉÃ*“Î|-§x^S¿?@–DÛEj¿ éÀê3]zÕ|ÞÊ'Ò{$|yh}¢ô½ÕëÙ‹2¨”!ÔÆ[G¦p…GQl¯-äªÖÈõë¤)µ›ÄðT6_VÐàèûÛœóê„oì#OÆE™†ž’¿yýŠÕ×ôñûkIÒêÉß…dH|‚hœžè®¸£øBV ÄÐóÊ@!5"ÂK·p?`æŠÐ)d–k¥QYV­ú“ö«-¯šõKÌ ³ƒ]dÍÕH•ç÷°Š”ºÖ³(îƒJ¹?wÞòahkç`5&êÁfÈÄå^GšŽÖ¡Ò‰µ¨…ÿé¦Ðlõy‹ûéÇ«v9©º£¶Þ“7@¨ÇAN2EðÖoM`(:´ôžV}8þGõr4*Ÿ#J)…–ÈÜøU¶.?ð#Pø6ß[{H rBÂï›ûgÑ#¤„ø÷¢é`ÎcÙ`'6Ts¸£ÆøÔ'Õ‘ËòÄòFsH3bq‡•”cÑ» çˆ|ÀÿóæˆÇ €ÿ9…áoåeˆPÐ.nìl–gÛè@#Êîoý 1âÆøõødÕkRhö)wC×âÃAñ¸b8mpÔ»–& C©õÞ¯qD'kC­yÒӮё·£õmµ/Š.à üØ’ÊH`…­fû6"SÌ9£QÚ{»¹ï¦Ò`´ÃJÛ‹Ó•zli\ì'¨ó§pqÀ~¡)"¹ŽS›Ci*Ô|D¬µE´6ZñíÒCL¢ëÞ@]"bán'ÊßÉý+Ž àUDf—ôeeÙãÎú^ê–£•p–*©ºsÆ›‰¹H¬tU Œòç7žfi±~Ñ‹»à¥¯xâ󨨂¡³ÿu¨üMW œSq[û¼ñ2ƒ‡Æ=êV*eôa­D/€‘‰?£Ô?ô×Ñ÷k1þ}« `ÿêov³êú9ƒ"œ²È©Dao¯!”\2ôÀ6ßõá0H¼qîÒ5‰ìdŸ<‰>ÁO¾ºØXHs—ñ(æö›{ç+"v·LÎÛ”ÎY’¼¤ù-¬Ù¿œšLMk œZ”0µçue•å(lu©YHÁäÂáG7Aý9DŠYP0· _¦JÀ"Ýñ`“Ì›mR¸ÜÍ2‰úº ´¶z¹Ô‘lx à+À÷ˆjÓ>íš4Mï´à(÷TÉãTAéº1îOí! àÄ’t$â)™s[<*î,=¸=äà €Û« bB âï±ÁgXeæ@H ¬ß÷‘¶xüCo.S« Ê¿”tìÍñ¼2ÄJ éP1“ q4?µ×M%øß¿2!yqø&}kó6t"Ö¾š;¥‡…Ø,tòu¸N¨Ówë$Ÿñ„)Eãµüû¨TÈ‘³¥¸útRkŽ‹„tR”ûÉep·,ñrÎXTÝÈ%ù‰ •@wIßæž!¥]ü¡ÓëÓC!nc ÑJýhDð/xµ½xßðX›P§Õ?EÐÖÑév‘’Cðý|çGN²3¢öËrp?·ÂŠ‚®ûùLy2@á0_ŒÀ˜xRÀt5ìcЉ«†t5˜ $ØoÅ5QHÙ¸Cï?l‘{ÞmG%¨¢’´¸Åh–Ø“XçUxz <r ê?ú^2³tMoÇšãŒÁÞ=ŒàaKz¿’#Ûk»±þ¤*Í’+V…/õ_r8˜„FY.àjE7(ŒŒÒ¤2·ª–îWM~oƒÊÃÞÕ‘»ž,Š^u.žnzzCÝv Ã=SÊÔÌx’îÛðÚr ¼`G³› pº°ÚÙÖm!‹ì@©‰Hü¬/|ÛE MaBŸwÑÁ@D;ésñ¤«wåSÒw»6D¹Ýù©° ÿÑÅÛ‰åqžòáQkË;{Àž¥9ûÚ“sÙÉ¿Ìábdº€à.ý¦,ƒÀmJ>ß”¢-¥õP½ë24+›Ú¶`Š93œ%dåijæKTˆêÿYÚEBØè“Áÿ‰Pîaa€@K­‘S‚±ù®~½ãøÐP_-¶-Èg$Æœ :ÞRµ´ßË„€Šƒ`èB¹•¨<ëÇÜv¦W´d„¶r¸ýkmÏFå8Ë‚A÷ž=3‰ §Õæ¸ZE×Þ¶O{º¶”!ˆõ²±™ä³´Äc9J5$‰½¯ j ‹gÍßÏP8GæÝÛ|“*{J_|LÒRPk¯2Bós´FìêмJÆéÝýäÄíÓªTÝzÑ.=ÞŒŒüÉVzÜ®Äèµ3(Ù_øðu÷À6.<ç¦Uó µð]ØóÀTMdP‡‡Dð&°UqXºAFœDe10Öj7à+­²y%¾Ó»˜”<£ÈÙnJ¤OÄ8*od[8ºþÒ|°·ð/j7·Yk*öDϱ'Hz³$Õ&Åh˜3ðŽ.ˆÏ”pPÜþI3­ºÕ uDê®â7žUÛ+÷7UŸPÏV•:„¾RùX“°M«1>“cµ<¼¯®Ú4Kwo´Õ+h“‚½ØÔ`Ü{S³]¨Ò±s«–'­ vGè™vLóçÈ˼ NŸVÖ'U€ý[ˆÇûó³ Mô;¥ocýAQ@²þ÷?Ÿó^ròþ—lK¾Äˆà8Ψ-õzê›èøÀqÙëv±K72,7¼GYùO¤Îâ™Y5é¹M·.I¾,ìé\Î2MFF})á†=€–­§Æ7ìvÈʺ3(> >•—`8]r—Ï"†ê4ͼù!Ôv5*à»+ÐFÒ/®Í‘$eLÑ‘Râ†ò‘yÙÕ®°¦€m轨¶†Ö]´|-ë7œ‡<—Û½î@³›«™ý5Ñ0eQK Ðo*ðÎt}/éÄJ6Ë„~[8—¼Ðk}Ð7Ú9.>ŸŒ("÷ØÇ©R\dÆZ$ 6Ì&ë µKÂŒ2øüÕs…6–YºvøÀ(5ŒMvÅhH†OZl©ÙÉ -ùÀ™ñNØÝvmOñ N)óë °°OÝ:´‚F[]ÖÌ Üê øÙƒXØÒ-Ñ$‰0d¹pö’ܯ:ÎuÈ3=ÿC pñ.òüìÖͱ$[«@ât# ¯ô½Ñ¢®o¦Ç® ¡’¬×æTŒ2%•*ĨÊàþJZ©_†¬×|Ž#æ2ãÈìþ4#ò¾i*í`LñÍÊ$öj²y"ð¯K©  ®Mõ˜¨%/+ÑH·…*ÍÞ´HYÂZÓ‡ú6*I…w?¶ÔË{·‹ÂߎF iR7¤"~_æÖÞ­·Gm άuZt@Iß% âh<‹ñóçÒ ‰­œ®­Ü qŸm„ßYå¨Ý ^ëV1éч2xøûvW·5áb•T÷íÈ„´:ÌrôôÇ&§©`¯«í‚ßœª IÉÌ®j>vÁføR̪:Ex(rI :f*­¢zà¨1tgî>N®çÛt ZÎõ‡GÇÁJ;u4JóW䎻¤£[ÊÆðL®ç– §å(Ö>ï0† -¢=°àÑ$´L©µM—d† Ü…@žlXx"FÕ‡ö‚~»“ËóŒG^ú®¬ó×}ÏTO'—3w§W-ûÝ?I”ð®£ã9óÖ\¶þµN-];üCŽç&âè”GUü¡”«T*’†’ì¦ÀLÿ ÷¥S‘¼Ò=èí&`S.#²KmšAw‘ªîöÌezÔ;ZÏÀ"*µ½l[¼Nõ1oо¢çʦKYZ•¤×^iDEéÒ7»u…ê6n©¿Öôz$r›ôúhVøüw½m¿UryðR½C£8oêaÒ¤3³>™Y­%dUј»™œ®¶P-ôÃÿjy ¬¬¿,YCÌtþŠn-(lhëª93{›4¹eáMl:ÍU ŠÖ¹Ñw9†Q¡¿b¸`Êš]˜s’Æ-á󪈓ì_«ì€2t&ºm½ëÄ{KâòÒ9(‹ô$ˆú˜Š ûÊ/éôVRÒgBI–Úg¥¡xtr…P¨æYl=ÂÒËfý“úžDô¯«‰‹¸- Æó¹}4¹vO Šk²0"ØG áu2@-~脳†l\3pªv²Áþ–6èýœvU¢i8wØ·Ü,“¯Éþ,•Ì{\âøÕåìɃø¥§{Ñ®Y+Ââ(+j¨èz§Õ'¾0Þšñ÷ añÙIªk½§IÁú‡›qÎjp†º¹h]é÷ø¨ÎëC^›T  ¼ׯN°·ü¹Ç^sqnbIìa¨s§TTé:?ÌÈ0’‹ò÷î½A€ìŸj”3Y$ –?ŠïÒå2Â?¡ÛØEíÑÛ·AÂG JÏ_k:¥­UÁ7Mƒ «)kÐ0‚`ºÚ×½?9T„ë/Ú§’ø] $òãzãJ.,âv”"–%N49>~Òº?Ô­„Ÿ#Hކ­#ëÒõûlþðͯF-ŒlÑ23rÓ•)æ ™é5²Ø“f&£Sªb&ê/[³Ï}ß™wß •®cBßH¬öçä/æ®P}U˜1îßîóAwßÅ º»œo#±Ô;9å[¡ô¥Å4ÅBÉÕŒ1JZ÷‹ˆ¹¦¢þM~$“+3Fã:`M5¤…i—£È|´»KrÕØn{Í$†ðÞßÈY÷ñ½„;žÝdŒ‰ºÌèÛ•A®†;zGÁ^JÜäí(#2Д¤MtÅÖ¾”W?!uHúï¨=wn6¾Â¯}òAÒ„(“šü((ˆ6ñ¯¨ëR|«ZI˜wW,1zÈ8‹‡ÔF¨U9ÕìnåÑhÞÖâ6òÉÉ$K‡Êɶ¯fN…&æÜìbWtœ™ O#¨*=ü¨åb¸Ì°¬o„íÔâÝ”8)lºÙ€žðWi)DËBc¦ 38MS„"Ÿ­f礥!׸íUÞ6'Â-ß,/æ_Ư£i´ª[oèôü·Ò F“kñäX¿È_îTµÓ—>¶õ@!\“ó2ˆ—ð‰ší-k JÙ?ä¼–zqÝ÷®±OäòöT ÇèD¹Æ sÔ¸¾]©BÒ=ñÎÓ+)j‰çèÞ‹Ò°*›!«=ÓÎOT †IÅ´™F ó÷pBí¦ë#ðH™ÿ´WÝÎ@Þoz¦ð\A5æÝ›Yt«÷< v ˆ„ØH×V èdeˆ9ê|?:3#$fìY†ò0¡ëQ çO—=Ž~ŸI :¸®‚Ü«r4 (Œõ:Pëâã˜@cϱт#©rÐ*¦ÜC:š0þă.)Dáø®B<×l¿ÁÉÔeýJøSDÔ¥Cœ-&¼]HM¡b8ItHó¼£gKÚ³šÈ…rÜ B Ç@’Ìçš ‘aÓöê¿§ö0U§`äJE ?jcØØËM\!йRµ©"€H¤èUžTlnjS-SÎÝ\º[mo‰:Äó?Ìb÷dº)-*{ð½ s"eá6—3 é­†ðòzy隘Mo´ošl˜²OU!©_wÇC|ä¢4h×™ÖíÖçˆê:×Qרz\óßÂiûî?ˆ‚ChL¬Ëï);$õÆo´ËoÚÝñ”¿jrñ#àµHƒr;÷ù/ˆæ\#­V{LÇé˜>œHeR=YËjp;íWšm”žâdvîÉ¡ ·]äcj‚ÁÎ/q=˜å- aÒ¸»Á¯è&Ë+â½ì6|[‹ -P~Å—ÝÙSbï“2ƒÓ.üþC7çø‹ÅÜpT‚-îCާ+V¶rì·sNìÕšš2æ(­jE\íqR«ý0›)ÍZVá0ž u"Ðpðâú BZc„yz„²†^MÊ+ª½ª|ŽT¨HKíZ¯ƒ®ÿ&ON!{ÓÁ’Ý”K *Ö\Z¢ò4ìïGœrÛŒd„zìhúz»sýU0OAì°2á4ï‡yÂ,ó/„ÏWr ZìÌBî-ÌèöTG4‰H‚MQ"ÄÓ‚\ň0ö ü,=š'c¼Uu Ã(󙯓¡ÂkdI —ÍŒ-qá†Ï»”4Rñ½óLíj.CöeKÁ†ý K­øÑ·±ì%Lé”¶ÝrEKT>‚cšÜ‘†kõžÇÚK¬#P¢bM¹UÅx±¶Êìš?¡ÝHٕμ¾«„qZ¤þƒ¡£G‘Þïú"d»P_XOhÃcX¿Èb"°¾!,:˧6-'šz9öP<þEÅ —ƒ‚¾+Ì..c9à üR¢á{:]àp—ùþþ9«-<¤懲÷´å‹}ÄPÙßL#÷x331FâÚ$aI¾jUŒúz®³Oâ7|UÔ R;z;à=ýÆèE>³x˽W¬ÏPÃD@q½÷´æVTQýYòÍ¿¯Ù"’ÙÀ/Ôâ¿Gi'áX¾0üâôhÝ‹ A§ k÷‘!ˆYÄvcÐ<ñ[ç•OüR/ôàmÇÄ[çe¡Ÿš Ôwéƒg u®i¡Wëôn¹§:½ŒýU£ý .êÔ7MÃyÏKtÌÁH» Ðo_ðTY§PÃrÇXv$‹**\ÓsöOaçKPªâž¡è âŠ×ÎŒ±»Ë&Äìz AUâÓ”vd¤ÎQ¨s³hèÑy ëJkÖw€ŽoÍY³ 'W 4åýç±ÅŠä e~#r¸SÅq§®ÙF¦‡¤#¥’O‡7Ïûu£¬ØV–Í"-])ÇKôZ›DÞ[,qŽpÔ š9Ìà 0RÙ?‹U§;¬²êø‚'ÀY˜¾%Ç7” uày\î^/V.K9Uݽ¬8È3ìêCÛÐŽíöÛ¦¸(¢)ñHWUŸðó. F*•"GÌlÀ‡'òzÂú7V\Ötµ§ ü ô—×A7 °µCë-ѧw¶Ë ó7–q²n¶¹°±ˆáí£‡B¦àªWÞ!šeªjù ‡‰ñ0•ð™øµDV@ÏW´þ¦¸œFé[nÛ «³vH†‚#m C«%êÔg¾°_¾ÔB8†4æÃ¡ëq×%[.ªÿ£:Àxk·­¦jÔ0Õh³Rþ$C¹Ñ šˆ¸}ˆîaE}‹nKØÓÐĆ­Ö_ÊëaÃ1‘¹¾o+ý1ì¿ç)ÿ$8iS·x¹Wüy_Hä'®1/Rñ¬×rù-4Ç|yÿ=Øõ%yÐ<‘GbK̘N”¢õ0&#±0HýzOtäŒîÛDd»2OkQ­J)ã@:7}ýêIÔ­ S`!lŸ°>‡yÝáO&öT œO…"ÁMvS³8 (CÒŸœ<6ý°ìJ”ÍF:çF  }f‘½úÍLx>M› Ã#ÛU¼D{¿?ädQ ˜n‚ÈOíÆ©a. 1}ª ,Ñcº»&ã™MG\1_µçuÌfêôJ»Ø}L~¸Ûü ÎÕ^<Ç íÜ%¤r좑«ÙkÒ1éíÈòãÍ6zF ƒlSãéC•Òò~I÷“"ÚÒC¡‘­4è%MaUý†„uM_lÄ$Êɇ9ÔוáÔ3ŠDÜõõ¤êÛÿÚmBmLd¯yÒçÝÇüÊ{1AcgÚÃ}ÒÉà{Œ›±ö¡eV¸Að¼m.Q†¢ï€ˆÕž‘k$p Ý®öÞ¨Ô*ì×2ãxêeŽ8ê³sä:QÜéÑ´\?oNp‹‰?–:ÞÛÆ2Eðj¦¥Á=ÍÇ § ø1´,yV7t¨ERfÔ†ÁC¡‚×Pj Ð!uahFI†Á1íwÒ80Gæ=nLÀÑË«b@Wë%L?A=G.¿_‹ñH'™*×&~0èO÷˜_)ªgkV90ûêxÆxK?x[¿øcŒuëÒ¥„š"¥îŒ.„Q$d·$ö(á /z¾M'eˆùàðÞñfVÆSæ^Ô@GÿZ¼µv¡3tàãœø^$‘SȾjÒËèâŽfR›ÆöÝ; 8É¿Ix™Žœ§¡ªðþåóý™2ù£•è•d‰ˆD.à\›ÞÙrôdj{^ü<8Õ¹Z&~÷2»sÿDA>M{îuê'‰áá'ÊkG)”¬¦­ºñT8|°BlWzòÿüáèˆÞCRxÎKQ¦C¦}¨·0êùŒªn‘©ýÝUPè=©Ä¬™è1ÆØ-¤"/0þ†ÿ¨”ñ[±t˜û,åÀW·‘&„hùP®ÙøŽ cˆ¸,¾]»)·äs‹=¢‰#z{ ¯¼&‘‘æ!¸ý Wņ|‹ñS$ï~‹>$½7­…aÀ1v2óÄ‚»öÐlh ’MËieɚÛLPf6PúƒG˜©•hqøØjÒ²BÚ™›ôË*ë½åA‡Ž¡ü¯m­ÒÅÄ[±î" òk-þ‚f¦÷Ô»e•[<êH­œ_\l ‘nNì§S]ÛïÊ‚x5_ã/`ƒ-°ùàÛ6ŠûÅ"âN­zÓ±Ÿ®Ž‡÷Mû«Ÿh´ùäÖü”˜x˜B· !í+„Ž•µœóQ}Ýç0døþ®( ¿ý]"nDPH‚(4uLé{Öo¿‘–á ,r¡RƒÂè]œÜ†7º¹êcåcmæ3‚_#ؘcƒÃ5¡?&-£Sžº„)ª1adÉÖg×4XC\Õ™ ¹:ÓY©ÕêuÉÖVþÎ"@àŲ¼Õ‚¢î»˜ÜTAS4°<©Â—(ç5Æ$nÌh¬*OçEùn`¼X±Qð6´¸ž¢²õEè T\ÕUß„²Aö˜ÇóÌAôwŠÎ\]CÌÆjŸ÷¤W……i+‡ÑHZÕp¸q4èÄmlvm³Ã ¶ÀMˇÚ5<1A"”ßID̼æ0ìD¸úsÚîj–]”ºƒ²ŒÅ<î!3ù±-8Hõo€Šk;wÇnÆÇ •½Í ÂOÐ#hæv•/mþ!lWîikdB :qýê ´ªRöè Ḡ©3Öé8}¶’ºk^Åbÿl± : S@9œuNÜICJ2½íæhÂeÄQ¹Eo;:RÙsä15¢ÏN°xtê;¥ÚþU)=ÔEÇÊ“­'d;fÇöªlU8V“4Àõ‘õ{¼M¯FðŽt;PŠ@âõúmlvݪ Ë„t«ItÁâò’@u×MrÎë<çM Âó`S¾‹8–úX¤ ƒÈ9ìÊKzY¡Wæá:H1  Ò›)ç_LáÚiæ³ôcÇg¥ž+Wé/Wø¨x}'oºöV'B2ù,øÉ·ÊŠHÉå"åˆ_~Ôvž¯=Ôˆm†6¶t5ú]ö¨ô^’VäÓJ§^IŸžRPU³;“è "޲…¨õËX œ)n9“Ý÷„ž&4] ñ¸ç ¯¹„ü¹…‡µ:¬PÑtÌ“@\ aUJ)ýšs+Ȇ¥c|‚¡ÐÖýwDýh²™î×gþ#¹­+ßUúrå‰V]nªÈæænƒªùÒÌ7üžùx:Ïàœçs|[ø&î&]fX8¯á_š95Wê%`´±Ûœ6þ°³pÌh¬·€¬Ð´]Ê»ªë<"vZü4L¤àȸ>1õ—†ù€?»g˜TÌm4—[N ZÒO.(E:3n-åIŠTÔÓTéªa2Ke<­IþÅTŽ j w[’.Éâ˜à{Ÿ[3÷ã u‚hbƒÏÜ@•~á46êFM¹µ)ƒV“^>èŽ6ègij8‹y#œù‘½Öº´Îé¼Ý³¯Üqüy?ÃyÇŠÝ(MëOUqs¹ÃbŸ°U¶ÿ†Ëk²¥KM?’G›Í4T—d¾Øø›ÛüçלÅ[‚"—‡Oümth2’Žˆ ö¯R€ÝuUKÒ­}¬Ì•² Ç} n„Gþ™÷ï›úâ ’¯¥Öæ(Á:î'ÞjE×7"ÖÍ"NÎäø0+š«ÜGx…Ì>[\ŠíÐ2®Øa5 AqI£ŸÂêJ“nœ» ÂF[£ˆ÷aÚš©'ãÓ¥Ë.ãŒ7Þ¯¾ÁfßÁs£‘¹ˆàÝ‘i¸±ßqK⽫G0ÔÑÒ»à¢.&e:Ûv]<ï-·3Å‘¤ö['­¦®lTÎÕ`•²×oF¥‹‰úý؇Õ]#&~ì4J|×=dÔnàÐ$d¯¾ïà4*òFéD¡e†ËKm)Êè2ÞÍû¥æÔxi>QàרH¼Ù5ò fÙêêñɪiK…©_ÄÏ(#š 3• r‰œ÷{ {XxÍwË$®ÆgÚ³Á\d \ °ÌkÛ`Œo“ÂyĆMëaf@ÂM`šÍq dCn7Qr&áüê ƒJyädh«ƒ ³Xe,¿vÅaûÐP˜“’°rk¡óE¯š„ Æuð†+$Vh'¾¿L¼$ ‡KÕÜ ;€œ·Æ’»ž ©‰Èe¯"uÓ¤“^Û2åï9+gßÕŽ¢ÅËz Ø8•ä,þ}Óm6 ¶ M•‰)eCÑ»<³g!AYh:à{÷Þ5Ñ=Œ¼âÕaàô 3¸ö·ÜÎxJƒ '”BàâõÀýþ¼+ƒÍäÆgÓþàˆ9-N'>„µ:vxþ–²]co–+3þÄ(C=œ&±¤­ÓÏXŽ7(˜ÆÁ³çϳÄÜ—ÈÞuj'DLÏÑŠÂï<W.z@´æä|+ ~D]‹°k é9«ø_êGŸKÚ_žÚ²˜÷!ÍóT ÷Di=ô>½¨!Л@ñ³hœpS¾Àt#Ùþjqd˜›?Ù~Æ ˜¹9Ó±9Í?)®£ï"œ)Ö<ßDFQg©ÓÏVØ:ëø’rõ~\|¯CKzpEðg55 ùЩpë4Úéz› >ÉHA½ômbô»$÷bž¤&m¿lVàÖ¾7|Ü‹¿zÔüÔÓÍh9ùÈ÷1Ig8¨®­ìå†Ý¡o‚×øO±ZŒGAáÌÃI>¼ªÖF—hs9‘G, ìl~â¾Àü`´˜Ê?Äùå|‚–ÎjAPqá}¼Fn £ZÖQs0ýXûß›/E®ïZØu—ô1Y]00Œ)‚$ ¬}ñÇUO„å峡V‰ùEPG%¿ÍìA¿}4T‰Œo 1dGj­ô‰¦–!÷ÛÝʶ4¢nüióÕ5S^ü%r]ã„›m–Àèϱº%:ñŒ»×v»°x瑃y–ƒaìvGü,¥³Vr·i´ 3P(ø™oC¯úkÛêÛ¼^«–SÌ“¤’EM™n |£yh£évîë°£÷¥`’«ËûÅ?bD³¯?ç7‡èæt’CgÌ|6W”vN~•ÖO¾SÓ1ˆs‰m%5¦ø×Å·/T†ëæ06o:¤k0ßgÌ<£¬Óã)C“’¿±_E1¦EÃÓpoÕ0áRK(ŠÊ$˶˜Jl¾ÂæÈ×¹òÓr“I~Û‡4üõ[Ig­°P˜E]Û8“´*¥Ÿg›Ð‡©Aby“"TKiýzºêeð®_Ww¯?ÿyB2Ï¡jj¶ÊœC¡—¾æëÑ{ û‘ëùyG™ñUÞ/Q^Á–3¨7û”¹È‡ê¬î< Ñeô‹^4 I1Dñ—Â3á1…T„\1K8â?¹k÷MË[˘gîûN-‚66Ý@²Ûùö¾XÍ±ÛØ9—8{óD,)º#ámt ÛíX4Õë†/p"T^ý¤m9>»³{Fˆ‡üp-HÇ£7.õUn™¸Öè•»–%u_Ú¿QO?0‘΋ŽÁ2˜j¸Qꩌƒ†Ù6;2ÆÎ 6¿ÁÔ†ôå*ð‘;ËÑZ)¿/M–lðÂ{5eÂ9ª¶®^µ—ælf—)ÝËZ{«ÇÚŃ¥‰ŸRü[Ëß•\¡¢–ô'™TO{©ëIÁ;¡çÓ„K¦ã* ÂêéèòÜä+~·'€‘ÄåÅÇß+©5ì–`ª ÄÌ™IÜ Ýº©G2ÜUÓÝbÙÚ ‚8MÕš;/ß1Â)c!‘‚6°¯ø]’ý¬¾0‰òÍNˆ{ +Ñi”ªúÎ4Ä‹^ÜkØÈœáyt(=ö¡±u ¶:¬©g`4Ùg#r•^?I,·ãÿÚj̧،°Þúe£›:~s¡2ê}!·“$W‹Kãk‚´ Ñ1ŠáVNÔÛ!ï ¹§I ß©–¾… pÁô5ÞO\\am° ›ÊÛJòöì%éã:Ⱦ€A˜ÜR7SiF8'yX»Û&i4µ§&g‡ 9$7[`=ã5Ô±Ýä?bÿÏᛘ¬œýP&Xd(ÄIL?y;£ ‚6:‘ûta»jO?…ÝŒë¾KËnÓÀ·Ø!¼êMàD½íÖf{ߦB °ýƒJóu`—Ù™p`°æX_ÓM"Þ"Ûij¡Ýâ6¼œSlQ熳-òt›+¯³}妹ñ¤"†êŸ³h]߉¯Úú#ÿ>ouò6œyhaÖgã2ãµtüt ”hýq*å«r“¥¬ck¦Â~Ž®ÀD>’a"=^ÊM&ÝQz=·Ž“v=»UŠ­9‘F§‹ZnwÇÝ‚öäa*Ìߘé«ß´Þ¤Q¥eŸ† ã'æLÖ¶] …Üì/gAOš²×õþ½@±Ç0õ©™_3k¾E>™àçi>9„û#æ<6¾æ®·†z=„cøûž ¦Ý­A`K(¹.yjæ^®Y3Wm|‹Äakp›ð,V‰–§›!#p—žÛø¹³ë2Yš!³'u¹k2`aìKânE]¥{õH=˜ï¨‘¤è<£F‘@Á„F‹„Ü€á;ìÄ®î(yí-§ÆýÞ?p]εÀ§÷: ÓŽƒçähvj«e§È°ZUÆbOÖÙ›‰¦õ-xÏd àeß«pù}¦p‹¢1#–«I*&îV^:òfpµp@äë½ÞöZ—v)ê%ÿRLš_+¦Æ2©„K[÷q ²ÔŽŒTÒíò)/w;G­¿?Àˆá>CýBÞ£ìÿ žaùå,eræÛ2ìÎôjž?_dp BÙøÐ,Ú)L"›ΚǬ?c¼>™ãÉ*§ë|™ ‰+ö`‰êuë>¸UxP…±Ë¸èÔáf°S¹ý§(Q}±†Ž ÷¢‰T°Í©®u~tË©òÍeFMÅPÅœü|õj1µ‘öx)ÞJé¡:éI“glÉdÁÚ»%ge…+ˆ&€?¥ …Œñ œQÓÿžçxÞ^Ꭰ#•1­3åè1ˆiŠ‚Smc¯cÖÅfEàPš²y¶X6a²—f`Kìz¾”ŽO[o6TÚ<úµ #m½Ž>ÂU›§JíH]ˆ0üT,1½©Â6*1û°K,„º§°‚7Õ°_äwž¯>AwìVé¼"É zÂ/À êúñcÁqäàÿn•óãË©ÝH.˜‡>-Œ…ÂÏb§;ftRø™lºRºË¹6üô)ª¬ÂB'²pÝ P.n h´]ƒ"'%©¥Šž+©÷Nnh›ƒYžÙW"v»Æ’?ø—ºxswܬéy¸3ã™Ð²ÝŒ(BíëDz¡þU’x)ÐÀ*Ï’žq¡à4ð»o³˜‘Ë|Ïþµ$÷2(À¸HLŽ ]úvòé è1ƒãópƒ>To‘SE¤Õ#ȳӛÞò鯡ÒÊyv+9†ÝGÖJÞ9h]KZ ¾(èÄCd¹É‘ÙÆ:jëè+5PS­Þ5®è×4ÈäàhÍVRoc£Ÿ©lºü†CéLÎJ âÿÁ·ì‘ (yd¾†WE@(K0õáÉ|—I±zÕ¶ÚÃf ”ôÑa)S„Ï[ø)—Ýã<ùñZ%%:æ‹2µaêøí«(i«êýEqœg¡©n4޳ŠÞIϲdŽhƒ‹ÞŸ’)1dy÷C7ÒV·A±eS¤¨( !œU—~òÕ/§aù8×î¹ü|ÅWh 䇃¥ÑÏ”H—\ºBq¸$+^ýþ_צ^«ÿâó ‹ ù|*üu†­³;Ϲɣ oW”9âA EIq@oùQô'ÌëfczðóÝ;|ÂNi¹HõR\øµ‚©‚–ýßÁTå]·ÓΠGºVF_óCA‡V±‡¡ËZžm!»!(¼?D¦ýN;3ûa\¬ *1—‰Í5`7žë‹Ýéz_¨“¿šôÄí½®ƒŽ‚—‘ºíÚ²óæKh…ëgõ T,9–¶8×yeØ:Þd†¯²2»·ç¬ÈÁzL¾õrßñ¦¥Eã+t'ìõöKµãá áb0ÜÙÖÕ kæ"Ã(¼9œùI0Í®cøG¼î°” bõžƒ­ÞÈB¼‚ïè‹'ý¸Á8­1ÓI@íyçŸãçå…]¸hE*v²*éÃò^ Ñëýú;’qÞϯ®dt7Í}‚–}¿Ø¯ìªh•´á˜Â– µO2ÁÙåÔˆÝv?9/X/—%VÀmû猼”:d_ºã"©€EüiK©£UF(gŒ¬7õ c=:ÑgÌr‘ÕÇG¯|³<¸ãÒI7ç'Vqp[§ÊŠ>¶Lž;ç9hQ¯¿„7Ø\ÜÁÇkêâgU ÇZ¿°½/› É!‚ˆylÁ Н—}&ñmнcÀLWu R0~Øu‘cª2ó›û¼"¨³ä›ML¬vñ(z|5Í×MË®Qf‡ ¯´LIú½]3{VwYshˆ“¥uÝßé|ÓíM˜Ÿ±úYgR ·Z*!ïaTÁÃfJʶÈv¼¡5ç}’Á‚U Ë5Vh1t#3Ø ¥@UK#ø™|Yá­Ó;àªýVö°ð!ë¨OО¡òÕw%–òMtBÙ¼¦‹xƒRfñËE"¸ÖÔ>—Éâ°x—¡ÆN'Ï[ìc²ÐÜÝùÿ16TæàÀѵS”僅âùPØØ)™ËÞ®‹ÈB·J“k9™]8ÑØü_¦€Ì^WÓ@8ÅHz^G²·…ž¯oæÏ»YþþTLÉKß}ë§O­ÏÒ\‚Qˆ_Zÿ& qD-@E%º[ÆÍR,!y<÷ĉJÁ&KSDØcs®W¤¼¼û–jhúѸæa® ì ¢38¬W¦N"#ïñ”.ÆFa- Ø«i„ m`Mt8¸Îî g³}Í!Ø–:v«W8»÷e»þJTIMÐ9¹ìv‰­Ÿ8#¹-˜úR#CΓá½î¯Õóò,GH”\”‰Ò Ô·¾ŠfÉ endstream endobj 85 0 obj << /Length1 721 /Length2 16244 /Length3 0 /Length 16837 /Filter /FlateDecode >> stream xÚl¶ct&\5Ûê8Ol›tlÛxb[Û¶mÛ¶Ó±m;é$÷™oæ[÷®»ÎŸÂ®U»vÕCN,fgë¬âad¦gf`â(‹)É2311˜XáÈÉ…†Îv¶"†Î@€:Р ´0³X˜˜˜áÈÂvöŽfæÎ*cêjÖ†&6Ž5;k;W csŸ««« «“ ƒ£‹Ã?EÊ@ ÀÙ0µ°„å4%åÄTârªq -ÐÑРàbdma ±0Ú:©¦vŽëÿ8c;[‹qrbø7[W £ó?ÄLíl²¢*Bbòr*QaFa€¡­ @FâŸr[g'žÐ@cG›MGpþŸemø?ËèÖÿ²Žîÿ±à˜™&ÆÎ# ™…-ã¿t“´5µpü'lâbÿßÔ?„œþá úGCj€ Ðô´‹µµœ¡ @%lgcïâ tÈÚ™mJv6†¶ÿEÚXX{üÿâþBÒÙð„lÍþQŽé?! '1 w ‰‚…ó?R›Zÿ#Ñ¿ãêÀÿìEhbábóŸzà?zü³Q;[kÿÓòŸ1þÝQRKHRA‹öðï´¨­±‰…­@Ùù- MþøwZÁÐâ?×ó_2ÿ½&óÿõe -ÜÚL ÿ:¦½ÿZºÿõë—»=37€ž•…ÀÌÆÎàfåüýÿ¢kìâè´uþ·àÿÌò_ÿ߇ºáÖ–íŒyƒ,S[BÊ}D ç* içf Ti—™AW¦{n´Q-†ÌMô¯pïUpóÜfýøw/w$ï›I cÇ“SQÄaºË¸¯Å¤f>5[ïŠùoõaz×j86Ær7áwÎéëk 4Sl™9ç5R¥ü¨âÌQeý(Ûq«‹¶âÔº”hZ_À}Új”9óà‚k£Ÿ¯{k`¡y»7ä8úæåþö‡¡š÷f_¬ðê;F¶½N nRVb4ÇG8G¡áÜEa÷_(I¥äÓdëÔygÙ)ì£nm}zÿö÷>P¡þ¡¯°Èz…/9y2´M³£ÏYÞµlàC¾ÉÌ–€"mü¥+[(ň9ö¾öÔ©5ˆ_"¬sùãq$ž N¸&š‘äyÁSÏ.µ”ckÐHúéÒá\¼ë\®ð«â±€ýÔÀs^‚Eo÷õÜM7Ë­Ãõ’„ŸþJ b jþKÙvö¨¨A*ÙæÕO™Ï× |ÐļòWŽžwë\X ÉðœNwÚѰècŒ[3R0ÿç„C‰¶ŸÑÙÄ¡“?î´{=›¾1Õ£­˜ý¯:OÞ4‡W¼ØÁ2ãïp³š5ÕQ%Ët^d¾€}öZmþ¯ø<€‡€iÅXLR‡=ÝÓ•øî ÝðuÅ4æ”òËj+¸ó“¿#ï›a6”pÌ W&°|%GüŸãÉó„zCJedÁ°0+™ë=- þÃûÏ35ø¥§ÑükGÎ;AO·w­„";l›Þ»ä͵ÆaÝ0d=p¤ F¿7´<(…¶åÃ|q¤F1³iÔº³U™¥$±™Éº ò²×ÔâEÁf4G.ômù-ì"²Îä”>4Rb¥ä9œ¦0›B”;oü\³7—!u:þA|²j,ë&1X2¬Í9@ÁîV²TïI-Ç~ÐÀ±75Ì‹yKˆeŠô·ƒì2@’=Z ¦ÖõƒŽ¬ø. »Fl™2ßQ Å/÷í{éÞº7G¶Ì ä,ª{Ÿ£ÙH¸#÷” íþT«kÍH Òl „%¬7&I¢ÛÝõ pËzÍ×6Èa2”ž_+)þë\ö ú>Í™½±te6î¼ùc%Ьi•WŸS˜wô!V³_õ}V[ ­ýÄ>øÝ‡y~ú2·÷À´ì#‰aÚÍZZ6&C} 8BÔMa{@ƒVÝ–¸L4¹ÀÆùÃHKv$âÈÆÖ»è8ãç ¡Ç õ¯ÜU£›úK#dù rþPƒû¥#—H×§…«kÛv~^æÛmÄ3k}Tdx£Ÿóþ¬’~GÛkA×”aŒ c5¸A†TTÛ‹¢Yåºýý jK:Òè¼Õ6vLu›“W2ªŽ¨‹Èàb'¨Žv4Õx}³_Éþ©…ìD4«žg‘æ{¾Íàìäýëx¿ø,‹Ð+^Âà‹ÁÜiZ&ÚU<ÍùeJ¨ùLk¶yòAÀÕor5D+%ʤ\¼®¦ac“²ìÚŸÑßÕٚ͹†¡€ÜùТ«w„j¾TÊèâq½[þ/ µêÎIËÄžg:Wì|Ü}ÍÙ(.±Xr‹b•uÌ»ªyƒ¿9\#¼v=£‡#î_Õ”«Y1Ü€…²š=åÌØÒp(⡯¬)¢$ëMÊ–Èê½vpõB`aÅã7OþE¶=RfîNû7u{t,ØŒ#â×2ÚŒik‘ª»uàmB'.¢°Àà>Ùî¨cu›ØZ/ÑüBWQ=…T|²ýGõû_ÖÆãeõâJ#"í§¢¾ú¯qÃÙàOì¥"„wjÏ]¾¶¨Ï±ÄŒjqT«³;zdîæ}ÐŽG,->:¤VËçQ÷åòÀªïM²»{Öîtî™0 #ò¾ü¤PŸWÌÁ rúÍŒ dïõ )5Z®P3£[NnÏÓuÍbF+žŒ2@+±.,~­ôw±ØðU¤ÑúyÎŃݲUq­*…_ë8gàsËjSfGg0(¬Á_˜zͦœa©ýÌópøëŠømͪ5 dñ«oðö²ìÚÈþ„«|CfÀjÍã<óíH$‹œ,€£A¢2;aÒ‚áú¹š³DEĸþ{ŸH”+ÙTž_ÂQü€ûµ´*Ÿwº“e±Ø>:âóÕ¨ ªìH¿Pè•&йþ.Ê]"CÑ'cºÖYrŸ‘,Ì2›nïjTÕÃ-~gzG0 ŠŽÒ¾pðé„p½09Òéõ5È+tÞ\\wuæ¨ZÙA/4¾`Oçж“ô¡Çxåõq¢Ë‚›Vq`ýŽîU˜TÈM¯XGùNþB^h=Cú30Rõ—z'Ü<釴[ÉJ #ÿȉÞ1(É“â²\”³YÁH¿aBÒÙ™ƒ¶”óìÒß4é]¦E6êbð#¿©£{µ ¯NòRž™ôHÖ¥Ã8RZ±r*°ö釖œ‚gó8¸à§!i?âcË“yãCs"š–´*5hü¼FC7Žý `Å×Î5‰‰"ÊPĶÙ‹ê˵Ò4uÍ9ˆ/¿BɨvB*Ð~±‹Hq«Õ´íÙÌ\•Jn`Ýõ.¸…ãž×­;SšÈ7a@Ù“í›*©ØY~mãR•]ІÆ:\:)02âsîEa³fx$ŽÓeOÎŹ!d6ÇœÌ9ߊc‘wµ…´Ìä&DÿÖðÛ­ÎdŸœ|qKþïßd Þ–W™Ž¯ ¢¿×îZy„¿1- xF’ÉÇé¤ôRÌ2ÚÕæÒE+Dd|öBÓ<×ÏvwüH%Wts¶e Ž}Vø;c Ç®OoŠRÓEbÐs^? ¡ þÚ_’5’+1š4 áÑ.5"(¹†öã_!wPÆ£09¿LòèI ¡i§´4¢cDÎ/‚ã}3 Ñð>X\Q~ù†¡­a|ä° 4p‹Ú*Žbh/ŠÉvÁŽP½ÎÜf"Í}zEÅ7"mÇ^ÃyÒì!@51¨¬³G…¦Pˆtx: Äžä.åXòvÒy÷&µL|#«´åÞç>û´Z˜V«Ôõ(Ú âÑ‘Qnü[¥ ˆÅWl}=ršyÆoйqóÍåÞßqå]žú~LÊ h²)K ?ßFpö:­Ü:å¢fóx|ÅѤny²Óm4÷p¡ FH`ñ»E¼EçŠYÈ(J¿.ØþIÑ×Ôô¥;óe[Aaí ÷ˆ"€ÖRçdŒø$¾«Øy ²‘~#¥›*5ZÉî[+¦÷OÛbÚðœÈ°³î¥RŽž(ýÝøkYrTÃc#!-ûí™À0÷gœƒ–ëÆ“[PלË>ao´¥Üß ž—†½^WÛèԃś91»n!ùk;È¥'§4Ù±(œŒc‡oÈŠNg5]×¢$Æ—?t…†°’²ÑüCÌè: ÊÄïxo(ç·ZÀ©eŠ_¦*KÖ$×`TžêÝS|cœŽ.±·§F¥ç°»²ª\h%¢Ž üºÒç`;P6hÞºÎVµÐxPLL¹á°oÆÝVïÖO§S5Ùdœâ|¸˜ åWC˜‰•ì:#”…&×î³Ë<Ïo¨ÐõÇ-”; Ù¤R«iV #~³wâÜÜÃé‘bžv Q}ÓCeíDyL<Úÿtîh#ðwØÖdô¢Ìÿx[Ü ©ÊN uÍIûój0ÿ%«]¶àY GC˜Ú]w‰~ÇuѨÃ" Íut”±ä§á&ò* Œ`lˆ£`ÇÓ.¿^`3þ,éŸ!Õ¨a Ì· JV½…©þ¾=¤.·áh‘»S¿ˆ¦Ì5âôSE‹Uá<1¥ /$°Ý®%å ÞŒ©˜¬®zÙ§§ð‰JÑêù`È”%«1À¶ô)buGe3þõG x Ÿg„å­çO'QçJ}•ŽìçbaëëÖIEŽC"ȦFTTÕÉÊ *ï’­€ÆñËìÀÕM/Bö‰2žã ¨ßõèþŒ…”ž’ľ…l1Ek­çäñ#Is~’‚$ý‹=­Gvʧ®þsÏ,ÆòØ&ÁÐ  =¬‹¡)½6Ì¡àO¿WÉVŸ ¤¹£^;¤z³2lUN‚§ÈÑMYeB,ý/ E~f¢Lê.Uá ¶Ø¨ ïDå"ên 9=àhD·{¢°+Ìæ±P! à?¨sœ0™[¹CþÐ.¥ß﨣;½„¾ùYwO)àÕ;›º ~xå—ÔC·œ@%~Õ.鿨½p¡Q£/aÉì`PÏŠ.îÞǧž…Õ &ù؈„!üšw¨ >‹Hyf 雎ŵl^ª&ƒýG> %Ïõýƒ<˜Ù.¢¦8š,±³íÇ»Ù}B¶dp±R_²­Çï<4ÂD7aU²à ‡—TŠpˆå7Û¯täÊ÷PØ÷$»–yÒ3•xv倮ЉiÒ€¢‡šµAfnë«îÔmëχÏX·¹jºî#‘Å1ËTñxkXW!¢]X/I•œËwœöqWòs®´.Wá‹×À’Ý4ÚŠd‡£›9¯Ù£d¢­oç¿SðëKòî”ïñW@i—8å½8ƹÎðæC‹Ï. æs0ÍpwQ¹60w˜rY3ýÁrZ9èŽy-’:ôÏ&ߺ4Ç*bÖŒÛQ â;íõ§<´®``nom ù_·Ãë+…>ÑóÐ:É Õbøu:ìŽ ]«¯¼>Ã÷¼Ì–þïóys;èðí]˜Vg.WI´qCÕ2^ä'š@œäh8¢^I„Ñ%§Ž¤xhðkI¬¹<½‘ÁÝQ²‘²ÈÞ¥;¶ÇT©º´DU—L-:õסE8úø“Ì8>vÌ4"n¯qÑuÑ¡§€«ñ5†²!·/¹ã]Òshs|n"ïƒáµ"¯9‘öu¯¶oPôgîu´$5ûÅGâ/$ÿ>{ø¿hiLµ°þÉtd|ü ëtÛWðœ4wÉ×óÕÉid¬ÈJ¦Khô s§pO“],‹mfÑ™hÒ`r„»ý˜<Ù¢w'1[Òº²Öß‹¬,s¨U%P‡…w%x¨Ž>Ì®pD)nµfÑiÝ[‚¸an*¬½O?ŽìéÑ=åùƒ2;³z1ûòu ­ì†±¦oBVÙ¦x]P£dñ€Ú ˜áÓ~ü…PòBiXgœáHƒGL£È[CL¢Á¸þ6êhó.So¥á`Ñ©/‹°úzç-o; }(Nº¾ZzÌi4£÷rÏ僷•.0Âà*ÊŒ¼ {-9áñ&õ´«ÝÏÎ’{bc ðz%}ò)„àXY_(+ÔMí–.˜ûäIÌ}:ºPOƒc·½QW¿ô»Žè~°”²U'2.W$Ào«i¬Z ’‰*ÝÁ…–ëAÛõE©Ù¦)oK]T’➦£sM#‰ŸóX o}· >í#„A7ÄCŠøÃ5 aõ®€[î9@VB…ÀÆÇççcüæ<áÈÛ.ˆÄýUN¢3§ÙÂ\buÕ£S®_%‰máñ´ýnRsÐ@>ÃÄ’ÃLa· ˆÔ?cØ›î ‡HÇáàeŽÑÈz1J‹æµv}ñ¥a?ÿímW¿ãsã`1ÞÉŸgHB´Ëìk‡ù#cœ;Izp)¶/ ¯q”ßdÍÄ~8Èßü'õ@­ ⱌ)cëfÿWð¦'§£ å,w½u:€/ ¼j_ú+_i—éšrÉià°ÅOo¦® šK-.ñ‡€.\л!¤ÁäTtž¦Õ¬¨å2R…XÊêA£õò²+„°@ŽË•qÓ¡ðSž-••ëÆVõ^ÔXRsÑâñrD¯7O”Iº%ŠÙÀJl†+*íÛŠô¯:®0¶™yb|­ý†ÓnBrNˆôüÔŸvÜiõ,³©¦3ø¸Â¦}“¨BægòÌA31qÇ[A0ô¼8ádª6·vY¯j±CP&äæQCp‹ÍÎme~5±_¬Ã­cÌÏ1™» Áaò§¹ôò¢ð¸B{3Ò™Ø kTŵÔ|š½ò¢‚T}2åU¢Lç´~ÇÐNߦo®phÀ˜îhä¼<á ÙŠá xª ?WÉV' 4'(W8¢$c´Ìº¬ÞÄ_xRw¾qQ‘N{XŠú‹·Ô4󘡼³¾÷ '”ý Õ×9#EDÝÛXøNÎ ±$”0‹^#ˆ¨:uOý{C±˜_[ ü]éB —”Ïø™8mÙöIuµ"d_MíÍì¨×Ó¹›´â v:pàBeî[k"ë0ž ¡qÎ)óm‡¥ˆ¦nºbó™œÏú½ë»Ç Œá(¤dºê*_ßAOÈÌñ-Q?Öûo"¼¨•àÝ*°ÚL§ÔÖ\ɽqÅb Ëò>‚}KÁï“t;™ÿl–ŒDzZ~/.Á?3cFÝð'~º*Pºí£÷2¤N—ãì¢o³U ïnÿãt×6¿E[~­ÞfïÒ“~£ñù‘%ë9<ä<@æ ONº\¬ÍÛÅ’ÙÁH©PÇF<ühˆÜæ}̃B\—® 56 “œ‘\jÏø¤ÉQc`ÂY&YbŒmëQžï•NNþýÖFá á–”ÖÙÞt 4ö¼ ¢^¡ ¾ý˜Œ Ø?p˜Ùq°yFئS7&24ê®ßOQÄsGí œD|q¾ŠÁêßãPÀ5AîåÿBÄõ6&<–’–èÛ¿cÝ¢–¡ÑáæLmäÏ}‚Ö–ål Ò±è=˜å™Ã‚ P´ô7âz¦1žPmþú¸ô‚>ø&mÃíÍñKv6@æƒ_”µ•Mž@øÇÕe¤%½²OÑ?¿H ¾þˆ ÚÞàNRÄW?þ±Mo3ë¼xÆÆ0˜/¡0µußÖ0`CrÅèçœ.Æ%}ò0–„N(D·96/ÓgÍu|[OV[¦¾g¼Ò÷SNtgäí¯ÐÍS\˜JN0 Åø =ÝJÖvOllô¡–£ŒãEÿ¹l–€¯f'zÐ&ƒ±Ã6ÄÞŸËÈ(Ü!OÈT½¸0µ 5œðµ;øã|ƒó#†WµBâ9\{PÛ{Íï¬^€ ]ì²3ß~zÚËýêײ$á3¬‹¡ºRðXWüŽË9ˆ ‚!l0c0q¶¡*7:¼R—ü=w¡ÔHÜ?l µ úXµ8õ³Õê;èàP/=‹Òn*²ö¼Ì8•œ¯’ÌvÉ=¿n£âNÇCx&d‹g¡G~úœH› œu‘Qw¸¯Y¯zjT—vB,•Jy&;öù™-0µÿu™ìÁĨK&Un°CØšÓ"Û2å÷.&WÜBÙoZ±/K¢MQh T"{g•e‰û¹-ƶˆ`pöb}þwžÌÒûð¾Q¶8Ö°ùÏX*–ŽòÖg<òIpoƒb=nœáÍÍCbSÅ…âë£êb<Ö_Á,gtÞb_µˆbbÝÂʸ«äü«—³ÿfv3æÇRüLËÕÄ)r^rˆ¯ÕÇ—Õ•3NxIªpžZªò·–õs該Iv§áüVù-ñny9û%­wxèQ§ã†T%$Ôs5§cÊÏ{Âo/£ÀЙ [IÈ$°éíÿY=I ²Â)J±Ó"Ó“óàÂ:#L·?1eæ‰üt‰Õ‹B¿OØi¯ÜÛ- ¢AÂPÆØÌæ1(PÙ=×|ý/..¹Èä8‚¨t×Co}r̪³¼aØxÀ:ŒD¦É©Y#nÇT»: Nw拱ê–TåባºûŸ y:`¹òí¦õíì(ý_¢IS#û"#x©fçë4!R œœ€úùý]|m[ît¹îh´^䂨Ðáw¨•ßÒ×À¬Öƒj½=ò…GdByëIÿfƒã‘‚£p $ Nq¥g"±,XJ»±±‹2ò0wæ_˜ãöŒHV•Ó2q±ãt£ÒZÀ3Ÿ>ï»14nTê"¥”Ë ³[ƒ®ƒè%óµ­£ö€Áƒ„\GïÇ‹>aGHµ ÃM|./*aüš$vÓ/tÌB¨õdñ©&K%4u¡5žÀZ·Aõ‘ºÑƒ¯ óóðr…v+*Œ3£dO¯V°¦qŠá~›‚¿I¸5»W}c ñ9ãð{oÑQ ¦MÅa¨/m¥w>IH5㺺xÓ _Eèl-©£N»Ñ«ÚíJ—}¶E4DOà ákùÌp¬BFík,íú”:¨?Ú‚–iÄXJBxüg>{®´4ì”ø¾¾éÿj|'rJãûŠãA5:<}ùgEÊŸÙ@´œ-W˜W•Ífl÷·fEµ™©ÊAÑ—¡Ð…~Õ|p!Z(FD¹8{k;²ø*OaäDYâB¦Ùbž €®Ýæ5% jˆÇŒœQüfŸ˜/×W.!]êyyoú¨WóÓ,‹KÈë"¦U„duüR…w¡(7ι£Q9cw;“œ¢6¸«•oŠœ¬Ôáž'ßOhѹ2»˜™A”}\–a„¥)UgšþJc,â•…ÿneË5ØcPuà )_‰õ˜(×ÃGô\Oðw>µH#|2ÆÃs¹ã¥QŠ 3¸{ÓsæxÃ÷=“M™ªMÍO–Õª½aWdRXTW ŒúBù ä¹9­›°ïŠ™e »n^Bã»9i*Oðgá fgÿŒâ Ì\ß3Ë„"Ž.ªîHžG¿„Áv…w|?Œä޵VG±a Ò!%)Y›Ä L0Ã#]ž§¶Ìaæ 0W˜A¯›e’?”šÐà-‰CCRü…¼ç Â@ê(³£ÏM¢ä |‹íÉp_n‹V/}‰±c ¢rÌ…ï¼Þe#‘”ÞŸG›$HªãŽ9ýfÔ`}"ôAnŸR|ÇÅðÄOûŽÝ4~ó.&î­ÑÑÒ´¥ÞeLF“qžü³t“ÄÈþƒ¿Eàüý3‹…vÜBr:œ6®®Å‘ö PæÛš$™áKkTʺ[‚¥¯V=^5”&7vŽîزqÆ#qÇæ÷Ìz3e«RG¹ß8aÙ l™hgç‘Çâp œ¥å•(ºx1Ü*ÿWi‘“ÛŠ[£RÛúí£èÉ£R> Ò}C­ùDÎ>rZ`ßPˆþ÷ÁBu ˆNbs11¾‹J„;©+몞1¯ï„ÀÚÒ`³ƒÁTQœ“¡½šPˆJ5 ˜ E<]û³Ü™^›to>Þ™›·þWÌ õ+ȳ“4`èº÷ý†_éY…ûRar;çÝl5!›Ü‡ž˜"ðhŒÖ 83–éÍq6Œ%|}¡ý­ðdˆ÷F.Ìh$ìï¦SñL°zÚfŽ“‡ , ­$,uM~þ£©-Ú5C£wÏ­¸MÉUå×}fPhø£3/Ÿé~;¡’÷«ÙA[v†aT )wÂë¶Å²wrŒcT§JÛ,qÃÌ(D YO"#‡°äÝläŽéj,píå¶‹¬kœÉþ¶1-œ¤Õ«¥ÑíÏ·#%š ?<^ÖŽ@ XéT”œgWQqaaõdµ%º4y.ë“8íZ›ÍuÄ &sȵ¦_ørߣªŽçqNçBûT8©ÅFžÅ£+.ÏðÁo2¯{¹ ‚CÒd) ßÖ©w‹šPOºtÍ)°Ï®ÙM 79ÅãÃ44iÂUÿRgw*0ñ?ã'Nñâ°ñ2Låêu! 7ŒG磧pü4sôUU—e¤pÇØáöPÉHO}‡vsksÐç1m¢²Ç· ‚„i¼ªÛ“wgîJå Áˆ`?gå¸ý¡9%J}£süÙÿ÷zCërZŒ¹ýÍ iEå2œ°PÿüNl™+7°>û¢®*Ep¥ ËÌ6"€ýZzR k!}bÑ\õ\.–ì]ÇKô~l/'ãy¶ch+}Þ)ÝãòQ»Ôç|…_–0ȉ_bÕ ×|Ã+'‡4¼œDòn 5$5íC®Dù;grW[‡E älyO®íÓ¾ §KQ"õŠjn5^Æ™Wé°Ç²—£9ÙyöïÕf04XŸk3c"]«Á¹(¯,ž½nx@G–N œÌ˘F´|Vôs—Q‡) gØšHMaÁlÑñàÅS(ÈÁ¶JÌOé©G'Þ¾§GÍ¡é¿Òx×üK…•)Ø7¯ÚLmè4(‰©m,®IîK“åD¨ŸÏIùçL&ÏÓ¿Pë²o!Ù{³%¼°™+1)¶¦ÒGaqÄüC™]èbV"ãªF&Àø?m-8%&þBj*6¯@Ä$%Ñò z4ÀÜÕ™³ ¬Ý±öüó›LN{»ÞH°À/,×rDŸ÷½t§QÞ©”N¾r¨»¼•fÒȬŽp¸Ô Š\ðŠ H\æ%²}Üë€Oõ+÷ÍT&»D\êb³GDï׺E’+ìCôDkA~âÚÊ!¤¼¿n/ú=jŠjòM_C^²¢™öô—¶$­ÈÄ0ß6ÃU6Eˆ åùÍ«6¶.¦ÚÒ†õ¼Pç üRþ"*‹FJª­‘Ì¢Þ°ThÔ¯lDsH«B³j»L¶·gW!o³ŽâaÜ7D.AæZ3×Wñ‡Êñ›py]ØÍ² R¡s¸X­´FïV›'˲%÷GÃ$£è]3ƒp¤P!PkCÐR‡4~ÓI8=6çÙó¬4`rMÀì j#qRªïÚa:kXšMQiþ‚ŠÒ ¸Qןkµ½ê7Å?#MNiû/P "ÖîqõüÀ†nžQ]7S–g<¥§½ìŠIуÜ;`c¥¸ò¸JŸçÂ{ŠzzmL\@Äþ‡ï{oTás< sêxH°õ¶iê(§…^õüöÓD%äfäñý¹‘,·Ù¢l›+$ q¥BýíÄñ(B'ƒëHß‹íyÒÆ×pé…ö…¸ÆxjÑ'pOj« ­lŠ5ßüí;*Í¡‡Ís޼E%S6«¥¥ ÖUÜœú³!ÒÕ¶göO3æ`}0Ü|ŠYS¿òj[Ò*N8~Õ8é rë dN8áXY~¶ÚÜ4±‰%FœúΠ‡aôÕ¹'ûç«$ Küm\mçP¨9¾?˜xô9ášyFGB°oî<û#=ð¯>ecJ9DS• *r}-—´>¨”5ˆ]5‹¬ì¼ü½"¾…FVÏt¡¥% ÂÖ •Ðt z8ñôH¨Þ³d!ooÛ3„N{.å• ÝÖáÎÙÔNäU·4‚±p×|)î«(u,ö·°=\š¬w³¹qWïv.ò‘·*pÚ„ ˜Úð+‘O¦[xú/PuLáz¦‡{I5Ëœ½ÞCŠ (®H–y.aÒr²F0ï”_a*ÛIl—)!wŒVv1œÎ(­ŠmðJa›dá÷?.@©3¼àÔIJ â#ï>¬ŽÅÑÉõaR|ï¦ÞÉѲ»ã¦x.?æa»4pâ¤1ê?7¿›·ò:ïMcªé) ÌÑùãÀ’Ó½ÕãaÁvƒyï¤äHÏÚ}í=—Ñ­Ÿ*›¼N¥£fÌŠ(öÄ3PÛ×'âSk~”ª8ûÈÑ+q 0s¨Å×9høï@Ë!€„@u8Œá·ê–XF‰˜`@sykÚ¡z‘Tçù¤Ð äëýÆÁ¾Nš²d:Ž\çɽºÙ¤[‰úïV*á¸ð©ä^{D‚Ñ:.”(¿ø.~2_Vé˜2¡ºZŸûþIU-n/.èªéú!²$F¶#ŒÔŽù© ‹¼cqÌí<³n†NZ·Ø/½õ»Ù½ù»ùqÃÃÐ ¤yZÆõðÂÁ<•ê÷Ý–aî°ˆ·fîùe¥¶v|åzŒiwe4I[ècÄ‹²ë|lÒ ×úß/B¬X¬'\º4— Ú\ é6•?¢Þ»æâ5–ýšõÁ a–ƒ7Ÿ²餆 Zµd~i£øxRë¯×ÝCƒmØ–9äSxñ7_¸_ä–SÙc€gpË5q˜Õ˨îÜF>–r½*ycæ›cÃŽn3ˆÝͰH ;Òôú™˜ŸD™þ3Ë#¦Üz9?o‰Çþ°"´ç~8vDoÿÄ_^97t/:¯O>r¢„êLÈóñ\@Í]¸±š:0¨ÖCYzfüÐxÿ› ÷hS$?ÈÏtz·ö¦à‹&â’ä9@)5طΘ’w m!¤–Bsô“øÊÿëJ"°› órq‰²¤;W1ÂÝÀSì´S5ó<Ô&öÎÇãn:x>Ñ?§I•Zñ…'q¬kÞñÍ·G‡ÑBö#H† Ë 3K+“,Ã-~NCZÛ“SI%¤Ý!:oøù0Yâ×>ô‹’ßá³kƒü#ÙÖfÝL+ôÀÅm)ߎ†Ëéíí˜5¸Ï*I±<‰³ß:h„¯BeØÚ8ÛÝùmI˜è-õb- ×Ô”/n@#5/zÎNÑS8£ãÎܯ¯qÒ{|Õ)þ¥÷èÐñ!ò¬NL‰{ˆƒ‚WÈiôpY&¯þeây™ÌËU‘z§Žœ‹Ä¨¾w¾ oþ_†ôÑÉNš5bC» õ•E’æy,NÆ«ýYº¹Kïã– ˆãSÝÓq«³Êy3~c1ôVÙù-ÌUºsÕR¶ÞQ$úngý0#´Æî£˜è*¹¥š¬4\D¶°Ôcн«£Ü2í‰þÛéU–yÎ{ KLqœ±1í¨#Ц¯iÂ)WÖÑ¸Ý ô×Ë=éõ†Ü­W õgÍ@2SB_Ÿ¬+?œnqEå0;“RÎtgCáº×º"`rÎeZ#ü»,wäæ´É ⦟ð.¹e†áиí"¤Ìç½¼Ù6Ùè Ú &Kg1xgö©÷¢,³MäôL2PŸyt3§‹ijEÌIÛ=oÁÍë7ÈË=Ž u3¾ d°)ËrÂÕ¸ÿöO¼¯RÐ<$x·9d™¹·fJZ8“„Žt åYù VTêGW¯Ì¨sNiÎp/Öcs|ÇNæmÆ¿$:7—.ïi¸U«R \.É:ÑY ãü» áY8õVÓ±Ê?ËDv§ÔN´%„ü˜xЯox¶À­ !®FVí³ØœCËÖÚ‹,Iz“¿â|RÇNÈ]í—”ƒmGE?w>gøMãý`Sêj&޳¥š¶~_“[B¥´VŒ(F^FtEkŸ‘÷G€ÔÕMUɺ”{V1ÇØ]Öº²‘Em ^{ùN¨U6P®^¶þTu;fÜퟤ;øXûùX>ÀY$±e= q_sƒy~x »5XdþVL{3ÈäSiï%ðçÌñe1FT qB(Bàcºáeè6p—RrÓébÒąŘY‡xlÚ³ï0ü£¦½ìri*a¢WÒ>VráJEÇ•È`ã_Oß%{Šx°)s˜Fµ…-ÊyiµÞwy~½E!Ion¶w[æbÜ—0}’µm7sõs¬`Ëu(þ8žªó³\Opè.þ‡#UK_70r<º µö¾%àø¶çGç Ÿ(KšˆB,7Y@’çhx¯>¹ã³ ÄÞbyz yëP}`"êšáÛ ¡‰¢M¸tG˜ñ!§Ð¼×¿¨FLü¶K«²4ï¾;ï…[{[YÖF=Iì3áPá<ŠTßj!0™Ïý78sŸ¸Žõ6 ¹IÀÕY¾à°fÿǬ -Ó”bZøj‰JXo#_a²ßi"R]ýXUÖù-„qg ™ýˆ½1ï^PÁûÌ´•ÂëßOB¾êC§¢ ¬Qã‘VNñP_±$%TD¼3­“=ÈÆv4Úõ‡&†ª“óT%)L¿ôÐÜ.jÞÛx »ÁDÐÃhäÔ¸úo÷P?–ñƒŽ³`_…¸jIã.¬XÁ y‘‡ND‹+AuÙ&4Ô¢«XóŽ¿ÅDÄOVGÁ¦xqIBh,Sÿ¬„æjÅã¾xæú7ñ¬9ÝIÞlÊmL=U§~VöÃê(Ï•ä{ÔÝnšá¸Ôô‘Bå{y¢½§÷=òKú9-Õ%+ý‡çÛ÷Ö?ªãü•€ÅU ¦+¼‡•mˆzœ"aM2ü¦d(CÅ%rd2ujj§J;³­çu"·\{ZñÀgØçÐŒÇßÏf™=Ê™½uw FJʬ«ï)¾Ä èÈ»o–ß6ëÃ\÷]ÓxnÅ'a©eU;øsÈYF'¿ŠœèÊ[¹¾˜û´Ûß*xâœÞzl,3´„ ­ Лk²µ¯/UmÁØ© 0RÆ?>ŠÆ Uº¶æ_o?È ðû'ðF!Š›¨Ú-Ô!ެF¸¯—_;f¦8(Ç¡í“W _M‡pòå'qz=l¥8š«&?,òÔ{úäÖ@£ K´…ÝvÍdG쬎Æf”aÙ¡Ž(ƒVbMš+CÚ½—ï7UÁB)¡eo7Ÿ$íqT%Iˆ®FMî(<8 a(£5OëÎ5Sâ=£„2¿¦…MÝsçôÿÿÓ?Üwg0’á­óJn‚;×â¾J§SZ|m$¤'ÕbcÙ›ã:ti/00’—…K PëJ|€9æˆôÀáòî!Ÿ3®´˜ÝALTwá$ˆ|›CææTÿc´#zMнBNGʤÒ+~£Ð¬­o‚”Fmê%ì¾E© È«à{uÞOŸ=%kJ&¼Õ8°PYs¹áhß”þžéâè·ß“áÅ ;ëm†œøÕNõ‹lc|ò$K¡!Ä:Äy£êÂÌO^W×H30 Ó.ýÀcy‘Ñ”cam=UŠw£Ä›ƒª˜ %îy€&Ô¯J›&Tô›3ؤÃóÒfïrï¡ÄÎDˆ˜§Z)r]eœ<`š,=uh@—F†eÙR\¦Ò¯FãwR‰Ô 0âz6JÄèN$‡=æèË (Gq:38¼€% ®k.`¾±Z­`îQ4JèR|4`,êÞŠ+ãÚþÖ~@WŸ_T©sœtÈWè÷t¼Ö(gûôvž›pS7øG‡þ©˜É/ï ‚Êg÷èî–†K£êÔÑN¾ì»ßWâäqG zÅC§ž8_Åsúm€M)eCšï®ËFVœ‡ÃÅÝÌ‘¾²ØÍsþží™ƒ†µp.LjŒâXJÊ=Ùé¥÷¸É²xs,Ìc´Š]Ù)üD‰Ì÷G¿üäݽûAj–Á"È4R_a¨Ž §§½7%‰Ucâ^b8ÿÆQ\oü­½rvLAHGœQ^qÍváK›^1{ 4†ƒûþ Wg;ºš—zÆi³e¡cx™pglu×ÏU¼Kˆÿ DìáVƒi⤼4 °·ú2„ß©Qô3«»»+BÒ—7IHåbU¶ATh à—^Šl{øë˜TÒ1q+{_ñ9Sê¬JŸ¢!éI«áèJ‚Íì_K>¹Ââïe¬Ó¼öX±27‚™›a»ƒÅùp7µÝ2„©šÔàOŸ(J”ói«ä~×Û|Ö/fÛ`Ñ£¶§+—z².µç¦–É“ £ïMÌ7ÿækáŒÓÅó·”*©urIúƒcKo ºÕ>i¬þ]AçW6ˆœ‰Å¸ ¡…ž£Ò¤dÝÍ6Æ%¶–b¶®¡`èÓâ'TÂá^v•<ÍìûÒ”Ý_œB ºŸí“ äƒÞ/«+,'‡Î’g½vÞYˆxÛ‡òš<{ÄW5šøv'ä‘:˜cÑ©œB^ ï5­µ¸×5¡É.vmþŠó§ÀÖÙ²RomßxÙ¿ h¿@Ò6&Ë0!wëGô‡ <¨D&P+/Ô^î·9cÜïøŽy[ ·\2U&1Iظ »M²e’PÞé®41Z°K,‰†;€]¤€šG+èøT—šëÇ»W(âol=6oEÍŸút%¡‹§‰%=mQ7Ur SÆ6@ÐÚîÈ/bPY‡ãðh£ÁôYÊBù*ç2„“e’;7?ž.œÆìVý·Bv8£æÀ×]ÇI Ó>Š~».ŽÐ4öPsþtÂ0‘3Í,’ä˼ü_¶]ãÚtêgÚÌ5¿Të+3ᯰ¡ÝzÙ> £|¤„¢?û¼ÄmŠÃØŸçìÝü ëŠÜΕé£~ äcnw‹41Àã®§äj〗µx;æàgÐL“òæÂÇk}³úù\ ƒTµc1€ê…_«Ú©/IõYÎ&Á‰ª5 ?Ôg@#l•“t]ÞýhoØuÞòÛ£ŒÝLGÆè$ëo鼨;t+âtR·a x—o!ÜqµÜAÐõLÒñÐ|O\ÞE„ §OÖ á½Ñ™@à…qM²O5dè]Ï>#-êX DkQ™,x^°%¤ð I®8UeÒÍ v¸£~ª`÷ÍàÝàtW_múý?(×þžyäðÓŽ"º­ŽX¡#ø\NøÁ…\ÀúôÃâø DIûÞ‹VnÂ{g¤T0Úky-î¨ó¬´D6D“ÎkN²nêër»ra1ðJU?”±3ÎÏCù^Fvô’ÀY!J¾C&MU ú€lï7¯¯tp} i;‡sœ¸KæSû“R” °d¶£ð8ª%iÛæn…xjR'S {§aëDȼK#äÓIy|ã UìvÑPš-dnA6üE>E²²Ðé[‚œ¥L¸7ðQè†NÁùÂÌ- ’ðŸ"~T9Û7êЕ)VŽÙXóP’dc)Õ'Ж':¶$þnQåŸïj•»6/u–´ËÙŸUùÚGL½ê¯4„ endstream endobj 87 0 obj << /Length1 721 /Length2 12217 /Length3 0 /Length 12759 /Filter /FlateDecode >> stream xÚmxpfQ¶ulÛùbÛ¶m~±tlÛ¶:N:FǶ;¶ôë™y3¯æ¯¿nÕ­}ö^§ÎÚkï:÷žCA"átUór4ga`adæ¨J¨È³°23˜Ùà((DÍ]­€bÆ®æ<Ms3€ª¹#€…ðÂGupôr¶¶´rP›ÒüÓ Ð°36³¶·vh8Ø9¸[›ZøÜÝÝ…Ü]ÜÝÿNR57¸Z™,¬íÌ¢ŠJÚÒ ’jIu€¤9ÐÜÙØ äfbgm ³65º˜Ó,œvÿL€fÖÿàäÂøO@wsg׿Ä,œìòâjŠ jqQ&5Q€1Ð 'õw:ÐÕ…ç/ÚÜÔÙþÙÑ\ÿcÙÿÇ2ùõŸ¨³ç¿,F8€™µ©+ÀÄÜÒÇôݤιÍÜÿúKÈå/?õ_ ifæÑnvv ÆöæjQ{G7Wsg€¼ƒ™¹3 â`o ü7ÊØÞÚÎëÿ‹û_„´«ñ_„–•cþ—ËÚEÂÚÓÜLÉÚõ¯ÔÆv%ú§_Óü_u‘77³v³ÿ×|ó¿zü­¨™ÐÎë—ü›Æ?d’“”–¥ûOü3,4u0³ZT]ÿjiìlöÇ?ÃJÆÖÿêž“ùw7Xþo,oìêlí ÐefüG{0ÿãù·¥ÿ(O.+3€…ýï‹›Õï¿èšº9;›]ÿ)øß\þ=þg#™›{š›Â­-;˜ò~·Io «ô/ž­‚¤›6R§[f]™úy­‹j=defxp‰w§†Wà@8d¿{±#}×BjoŽp41C¡¿Œ÷RJVeé_·õ¦\øÚap¡koªqyëš¹¾¬D;ÉžwV'ãTÎ*ÉcTÑÙ‰²°ºð”¤Ñ§BËÒùB0ß§«E™µ -º2|Ù[ /ÙE¸¦À5´*ª r<×¾ç nçÞYì`¸‘¾³ïôx´*óSëF$ÄðÖÚàß!“h ;{(ÜZ4}«5rb0ê~ Ñ”~‰²•pç°éf˜ì”Žq–´&óLÓà¼û¬”ç¢".öXM‡4b:†1´pm«BŽøU=Ù“ˆiD<õ>åÇ÷Mä§i¢öxcXM±IÁ×b|Á áš$Z·ä÷+{Û¨aÜmºNðèÏ­#²ÙcèÏ$ËšCLCRª¤=GÒ;^b‰¯w¨´Ã¶Ø]É|ØVeGÇPI†ŠÌï:{»fÙ$ôBC‚vàÑÙj|MýñýØG¦¶N¸[2)„fèÆf 侀ô‹¦”áÇw螇—ÿ)ôËSìr“€Hb—³ÉSÀü´Ø¥Hׯæ­ÚÔÇuæ\ô¾.uriY_ÃQ0;çV þh¡4Öñr4ܦˆü¶4!ÖÉ$6I¾ytŽ?3ï‡s·úÉnl× ŠUóRò€c~zLÐàNYóªvÖˆVãÞ œ‚ññŠbê/­d°4Nt„&q´X÷M=-Ð56<)l#n'YÐ<£$6ÓóÜÀx“£zg+[š°ûG¿Dm† $03™*k;‚¼]{¿¸d¾d¸ÊRmêUß=OS—ÎÖŸz"÷vpt<ái élŠ â"%á}5Kv~µã—tp[6Â#LI“˜ïõa¸mú›ŽÃ˜·Ùü²á…zzgÛ,ÌùF›ÎÆ™èbâK‰‡A(JAþ'ûÏ9 Ý]Õ§è{<ð‚#¥oW»Ü§Ö.ß‚û»)Aéeà”³M²Ñ8†¤Ø!ÜzcR¨B`o~þ9ÕÀª*ò­þ/ä%x´ÅÈ4W¥_ýʵ U«.ª'ЛPº‚å@ÛjŸÏ¡;aÑùŽò¤âyojî¢Yqö\UÓIê[ù÷øµþLâÊÜá=«3¢¬"¦³üzrèÏ€¬"÷$z?xD†¾†2š[¤&›û›>¾†=íïó bÝÝ7² "õk‚¹³5Õû×Õ2æ¢ twŽÖß7´ eZ©ÒÞ¶ 36>/Äêcâ³I?Ž©_”oˆ²Òâ¸LWÕ<µ9Üd¬Ç•Mªäùj[‚µ!~Î9¼? ÆÆ¦oÃÀ¡(Œ—Jôø±z$†Ð45Uü|0›Ýû•åc’òð2ãâröì-d‘îÓ‚òfÓbÀãçc1ãð%Kò ­µå"„°©u4ìê(7–”Äeî%CèYt_! œµ(l4®šÕ)kN¼é¡Iû­yB¸øú`pŒ`íØ–ßºéO.Yc2™š×ͪ¨orÜ™º8•s´ëùÆq¥Êç`I”¶ÕÓÞÀÓŠÔoÝ6ZðÚfÚ6ÁÂÌ…úõ¼ü¢|,ަá0ÀGVôŸVEq,Ŭî"ìCeý. ËÒ킲ݭ™Yè¼y_­¨>Ï[ìû€ƒÙØåPÀPú]1~¿µø7¸Y5çA>Áä4±’›»ˆ¸.!ÿ$÷L•$ÝüÁ«ÝšÓTñŠÒ9òµÍ k´ö¼äÙøôÉ÷èf™ ¦F…ö\2P–û¯¡ÎpÑ…l9ßÌþñ ž=œêvP”ƒ’a«(àøøPáïV\iå0˜ñÿÕ¸Sbõ’:‚cÔ õƒÈ#Š”ÔÌÙù’m”ïøò\ç 2Ôa¾¾x?™SÅxz;¼*xN#¸YRÆ‹ å—RónmôÞQbµí$`ÿˆ¡VÐ3x‹ð‡Ý8’æ9ifbÁJ*€…¸´¤ü€bï_W(åüxœÞ£ØC\½EÕ›:-o¶®ü¬Ý—½ u½ÚoÌ8a¸Z‘Dȳäî·ž/¡>³6n9c¬¾âù¸!:…5vS¤¬ õ½Ö0™dêæ)jéíhÓ€mÑ:uÍà]µƒ.u’ ŒÎ7BUŸ”¬ ÏßvŸž3 2èq¼iÐ}†}*}1vyÆ©þãZI?FN62Âü)aM °8ä öåÛ=ÂñÕ‰^{èÚÔ õçN´:|ÕsÍ„…Ù/òù2hq¡`¾w¸ñÚr/-›ENÇYù$:ãTŸÀ M¨é/EÜw9ÏÈb<…9É­ß02è¦ôS ¿“~aŽ‹ÙâôBB 1î Oö>ŸÓ××ÍG'$¡ë¾> ÁôÕ¶VâsgnòëèUa Ù 8¨¹´#áb°H§¬:L‚žEiæÇÿ™:º.ð LÁbË0…Œ”2Þª˜Ñs„¯—O¶÷€ €â\r‘C‚uÀ¾¯¸'t2SÛ~šQ(ʤÕºSxª¼©vƒ7ÓMC0¸µó`ëÕ¨³­Rú¤ûƒÊ…X½ØÌˆmqL:8¼¿¼æNnx¡Gô4}tÙ*0Tİa›ªÝPïéWõ$Ó³–B™Ö7¹Æ?t®vÁóÞS"º#=&‹…ßqÉ!:Ì–H)Qè‰Ò¥¹žTd0O`¦^­L ÜŽ=7ÄqÑú°À7ÿ]'I†“k£- ˜òÝI|C+F9ÃîÞ×¶]…îª!õò2bZ¾žÁè¨þ! äÈÉÀY…ÿ™'u^°°û»VIeΉª:Zߺ{+ G0øœ©ô°ù“f”† ~NF’ Œ›õ»ÅuÃo¨£×È •e%{nÏ…t ˜Ý=ãEá±/o„Ÿßû‚BT´[Œú XGGbÌj=’útmÃXä¿Ê†€&²hK ìã3™ñë¡ùÚ.fH ©ää‰Ï°5ÕkåÏø#…@Þ¼ò¹!61ðyÐßK6-~ÊÎc§ú¿"AûÛR Ѥ°(±›ûìÿT%¹® Y<¨Lû„‚Hߟœû–1¤cjH\>XYb#©Gú¦üVNglLŒ1¯k_ÍØÖ©u=ÿUé¥ý®ïMc"ÒR®vÕëæ3sc¨~µGej™Í3™aÐlW¸V^,ót£Ò¼î;®tâ»iwØìUk…ã!º9Î ß µÍªªx/tfOey.‚¡šñH²Ç\èVyˆE‰_Yj󦽿òžûá6>ªÅnDTÉGÁ*¶– ‚©/EþÐ/ ÈiýWÞ*ÎC²s®¾Éã]•¬ÑŽš×œÓ% ÷¦ØF—üèªSÆe”Ñïáv §â)˜ˆ3q ¬™®D\PÑÊ‹Ž=ë¶ßf H ÀkÎ Qt9\P¤/ËŒ~¥ÉSõÂhõÿ4 ”ŒV}#3$ëaMMQæçU>çÞ=”áÙÐ2ú‹užDEa„PÌ{>ƒÆŽà¨K.[¥ñ¶#`òœWŸ»Ýõ…ôÓ_›ÐK’pÚ@wl­4POùÏ1–Ïy„æ½x–:æ¬Û× Æï>x ÞæËÕãåÝ: Z•x7rê¢Wmdÿ{ÓDçñH 1^¦§BZÿ¶4¸ÉÛëÓë&UÙp~S)ÛùÞ÷ÂI4õ!ýË$&8Òͱö3œ×éJ"$´ûÖ0¢ì¸%¢Z’Y#©€Ïãݧ0èM’xSa¢±ÞÔLÑ8¶O©[1&ô°ÅÂ@&UŽM r±|°ñxÉÝS¾–r,õè_}á¢ðR„ºcÓùÅ²× Ü I>}<`+°dm üüñ'’ºáýÁ¤(´Gaa†\á~îО#’ fƒÃwëþ»e*ÄK9k ÞzrsòR|»íòèÀk:å£ðòOlÐ?8.‘ºd©ƒ)(Yf»&kD^bæ–6À¾AeÍe‚¹_íßEÞ·B”øQb°ÄPá¸éÛÒ² ;]yrΈÁ¥âåE,ù®d0;~¼.@È.0“J°Á>ƒ‚Á hu;à@|E"pŽ×Íù­mŒ-¢R"{\Dxó¡t­ˆ×àÆ¥)ÒkŒ' p åÚë<-œ|X§LTè ÆÉŒ‘wÎ[ÜγÑÔT«NßFU2—U×çd‚À™“Ñ¡‚XUgëÂìÑ(ÒòæPzĶ™'t1¥[0Sqs¿ÊfÑ[vÛ‰ºlÙ ¿Èžä60¼Ïö3˜“o^{¾,Þ!=3±õ—WÉ)G‰ÛªmlÒŒÒ?Ę  uíuîSk½À×Ò -ŒÖª hn26¾K½Ê½É{Áš°Ù}ÔˆËX÷%óò:Å>ö¤=ð)ï¹SƃH{E¤¾°3oþûTá¯/4Àº©¤ŠmT(!08#0Zg‡Öf]/ bn‡¶¥4Ìl ïáSØÏ0|,Í4$©k{|‚)å›V¥¥1hù«ïÒ5«$m4ÉãpŸ¿¥õQ¤õØAÝäÀ f){n-0_«—X½EÔû—浸ùÖ["gÖ ‚¢,®ÇÒx3!öþvØN˜•L?„Á¡BvúÔá'ÉRhûcI’ÿ]·®ƒ¯Ë…ý &À™ÞŸø²$×à œž@tÖ­DòÐ{7UUÖ¶ѵ#w_6¶èØs[&±þП{ðœÝEëænÛØv  Å`ßMØeŽ>’.¡*nþvÞ‹ÚÚÁ,6Éôaµj©Shž=M¢î?<¡S¢§ˆ²înúÚ~ËÐ÷¡h-ËØ#Lë~{êÂ{¹./sÈ…åã¯zw Œ÷e´r“Ù<ƒÇyðÅw¦Xú­ØbvË‹=$H^‘СåúÂw/ÀÚU-Ê€dˆ5~i–­º4š]c5<¢ÔÏÃê‹¶çKú÷¼“mõž4rÄOxnLç¯ó€C¢„E d@f,ÅZÓàŽ'Çn±…ñlç=yTukýsuD­©€P)ê°Šö“#ë2VƒD #0¦ úí^$´ÛùÜkѧ^“ñåÉ­3“èKŠÀ·ÒùÄ2—«Ž(9›Ã¬ Ðý"?Zì©͸Wï» bÐ9©»0‰4Üò&ðæ­£\%yzø»ö«&'Ú; ÆÖNócâïŸY«Lëõs’ØrĶð“[ èçötâM å-– nä#½8Ñg½øÃÁæ¯JÜè—„¸1¨nÈ~a])Ô?ƒz: ’ÊïÛk¤Ëa×Auÿý³+­º ©Dó…âgÎs}Ò0î®L2eÀsü±TÚQPc7õËÜol¿Ç1®‚0\¦Ü?DÎ@õœ4Q…¶®œ¯YŠ*¯üp!,=çå ›é§¿¯›,¶ ÞZyY̦˜Ü šú“ë~Óƒ¸SŽÑJ9í¶ù1+œÀt×»O}‡zèi÷qNE ™Dÿvhž˜ÔË Å+™èo“O:CoÿÓŒ’å¡1‰cÆEç~_i™³rʳhLgÁŽR™UâwÀ8…°¶Ê0/ ~{²¼¼m˜J–‹ô…ãSvu}X™ß¯ñ^ÇË)ê©ÿºÉòkÈåsiˆ{”Ä©á6”àÓQý´º´âHß(îä1‡Ê^Rüö­W˜ÐI]¨Šƒ¿³¹] tÙLåÛ}àð¥]„RoÔÑ' ~Q×NP¦£“d4ˆ’å„ð³él³¼³¢Îhÿö’.õ£ÄiÛ 8,›¥ã–ÓüGEcÒìSïú%F!‡Wb*þ4jÓE6y«º‡/œÌKŸØExÀ¸ëÏ×§ëWBÈCÉ/1™ßô— ‘дªÌ°- äY$ý‹Y1ž°¥óq<ÅÂqÝïx\Yì”òë+éB—/"‹-Ät­JfvYÍŠŸQU]ëªØRø+ŸP=?êú:[c}ö;ì'Pgí¬ÂÝ0ùGkMnئ·{óÇ'‡Íªz È {l6ŠÏ`ˆ\Ô=Šƒø’¹™Ø{cŸIÝ¿ôØ+¹>m´´*nP ÿ8@©¬Ú>ŒØŠ³|ôꔼwôÊ÷A ¶Åí ¥¸ß赫bÏ,UIU¼lqào$›ë俹»æ4ÿrœKž2PÝj™ï%ÓTEôƒO¸¢ÐÙ2+ŸžùÕÞev=’èöàX@9(â‡',&!’ícÜP~.¡(=%çÊèå,UÃ9V`Ë£y b6ûd­et†²/µ5½ôôÏÖyç!/HÂaqâ‰Ã4ßr¥ÁÛ.¦ Šj[ü£®Z“C½´dúä¸â^‰÷Mów8râÇÎ\ô©”`´âÛF²Ït¡îù¾‡Š„jñª‡zŒ ƒs“Zqú×ö—CvrÜØÄÍ^ñb+Œ¶œêµ~û‚8–ûä\ÄeSbÄÆÏDèÁÔÇã«ïm‰œVÙ*]«VqrY‘„ˆ«p:°ú;Ô÷ÒdÜͧñ±¼ëÙL N¤—ÙeCÏ?x2êXoåävKoR'`E5„>¡íx^¤LƒiÒ-u'wzCîcU«6MJ#m4J‚‘Œ´³°NV7>ç)<ÛöNT—õ­»¿:g¿QT+U™‹¦]¹^šüÚån©úóì¹SÔcãZö0«ÝOŽèŸNµ5+¨)|àqÑ£=±Ñ¡¶bžj˜x쨼ž ÎÛ¿|¼‹]Bëi²G½qD*lZÞ _S¡ìõZÁ™#ÝÔ ‘ €wq󡟨w`la³·¾Ã¼œÆ{Oý;¯çj.¥Ÿ TZ´Šžg?·í½5µ¼ýqWßݯaÍçZÄÃ2 ÎFD9nc‘ùn-`¬¨#רUÓ ËôÓŠ0~ËMJ†ä1˜™å”„a0«ÉK}ò$µÎJ„ˆüôØFF¶¢ÂŒGªÜVÓª{åУd‰†˜–çµ& ƒpµ¶B}k5­üf®º9ÒYô¸ÙHîm Ž°Ãž>AF%†Z"<%OÊ ×‡çš‰:EïEí¼`@áÏ„ÌîàNèU]ŒZw…àà¸dÎKœ, Q›=U£Êúý–¢sƒN?B7ÖpªNÐVb\Üâj7u02Õ¢flÅ‘te9IÌÎ×ÑU¯€¨c=ˆ—<§tÀ¬ÓJßÉ+(¡¿±H²¶€êk®XmSß§<}NÙEuFî?L,Öl7=?†ðÒÞ´{¥ÍœÃì3¾°k¤í‘ÂlDzú“’Za~•õ“ÀŽã ×Þ7(ûœç|¹N—pòƒcŠ”ƒÆ¤ÈZ{Ù 莋Ñò¿F–ä6+1Ÿ¾} ×Ê2®§(¡‚N@©tÒˆ/ÙmRS#Pâd8«‘_Ñ‹QCštáÓ­7ú² M{cÿÒÍ;J·Ù© áö/ó͇¸Õ€(m¨FiÝØîúDþ†c(:ö®2zE×Å^‘ÅCÄO³_•Ç-"víF'|¥û¥e¾Ç1Û“Ôÿ #ò^À G˜ Ÿ£À›MG¼?æ —P/áìží#mR˜ AÕëÅÐiC’ùvRµÃô,1ÉËfô©&á´‹«N<ÍME_!ïô„߉ßiª¡ý|s’!¶™_ÇsèÃÝ”…a³Ÿ±i1A¿òñÂÕÛ€™_K*çDM„/Ð0Èè‘,: w&Ç=k&âÿï%îãØJ½áñ0ý‚0Š!¶‰˜œÚ‡¨›GgëMz2´›5B¾·po_…Æ-'lEœAªÚ­ºb¿-LHõSÇ®ÝsɦĞ”ùtY~‚or—q«HHˆ¾ñÜõ²2êŠè8¶‡Fe¤™>dz#´~.ø®"QƒÙšŸÌH.Ï^‘û¥Ny翼“å’Ùb­{(ÇÃ|ln%æ—¡\D³ÙeÙ´ñÂó’€JKukÿWò¬|޶´óm¥Ñu2ïF÷e1cdÜPªíë³Cò `À„L™ëRŒå‚òµ‘£XÓcN˜‘åT@ÁÔWɧCq½È­TWÐs¯»ò~4‚¼k|R#=ðúXT… ò&ûB4ÍÛ;yëïì4Ã…#ñ9Ý7¯úÄpoôòƒ åÞrÏîè€ÞÅs«D$v ^¤Ðè›y'Ï_5æ Zƒß@tpŒÎŽ€ e‹éã^{ØFR÷+$›Ùéh€ÎãaûPk ˆIܲO÷‚¼°þZÑήÌ8/Ö„Æì¢W1õà>ÉÖ)–3ï„ æ_…C­KéðŒÝ™ÇÒ-*?á³h,,;n–âu$é..õ€GvÅøÃu,neää|å5<õÒûUm™—ÄÝç·dã"å+¹@*´“Ô·åªÈÍWȯ1 úÄÜ©d4\<È–Ê—¦¦)­JT9GÞ¶HÌTëG³j~ÎìEÓêo…jõ AÚ…­ç¼†°Ã"_3#3` u”^ï‚æ"h‚”-ŽÎò–ÀOƒOôtú^(’Bu/o¥=ÊõAJEÛÊ>cD.,^è{ˆ=X4F–œ7Eðz[›žÈÀÕäç(âµ1W‹Òz¢-ÝÞœ]7j„ðÁ%&ÕãBíð?Bbë·°ñj²þ«#Ùþa¹^"hžp~f»V÷r£¡”ø‰sX²ï… ÑésÒ´ HˆWÔ¶L -b\áÖHk‡.—û çu©"ëUÖÚrâFÂJ¥»­¤¢ÀïUk›ž·bñè¿YU;* Õ‹´èßß.¯æpI°ƒÝ.ë¼ðDæ±Jœ½ÃÒÈ~ÔéïµÇEÌ3ˆ ãÚÙ!y; kMç…Ô3ú®âqÈ6h9P¨`¹bÅ0É“@¶ÌYú˜<î†ê˜0aõ4 qg¤ ˆñV‰ûålBÈ,]Áu·Ï•Jã벿þ6›­ö ÙƒCU®Ùc³)ïö¯»µz˜?]š“êqív¬Öýàù"&2æl2AW¡Àôë˜ÉÔLz@xc]ˆÜA¢ÜäÀ~„ ³þŸtU¯ëc1@¨Â7ÇNƯ.¶ &’ïCié>PÀa`Žb‰ú±%€“-óY ‰FïÓÑW›„AÏ [’À¹øM´9<“ŒØ[ j> ÈN&¾­9Ë'8„±`. ØüѲùJR;ê࣠´±Ûßížµ^¤$R&€ ïÔ¦ÏlŽ>H¯1}DŒspżr1ßèY·FRbôuÔhÿ2/’võt$ŠHò>Ï®1oÂÄN]¡t@d"ì<=>EÞ‘l©~ÝÓ¢xô_[ùï½åìœcÿ;ê;duœ 4aè<1¼ewG¯Tx•ómp"r–Ú­€ تhÚ O\Ì÷Kæƒùžì-ˆv_-S†äñÁDmÖ¥X:ùÂsF!€´±}¬ k:#Òyqi´Ð¶H‡Z®1S³j‡ó)e/9&[|ÐaÙojŒ÷ÍúÜ(Ò&;žÏ¶Ç¿\* «åó…“—>ž<ñj…ËHY¯8/ü¼åí²bÞƒOr‹……³_Õ‚—§9‘f¿“áhQ« ÖMC5KN¸>ð”yšC.i[3R»ð½†üSüMÚsµ~_ižÿ.j|äòšf…Ûx1åó:Oà+®ÏÿQk1ß_S8WwQ5½a+à ºdk#i#Ý[Ï%qµ¯ÉOn\Ì~üù£Jó`#’¹;/®tߊKÉqOZƒ†p!áÑØ¹q\¬ávN4†ð-£ïx§«ºš«_Fðk!œšuœ×»ºä0 FùLü‘žÐ×¥m)"Ì|k@%dËUD~=)¸RãÉ>|ôŠæ})dÀÀ‹0?³*ú›.Ÿ˜ž é‹jZɘ%þŠÌu¡ŸG­×O ÅÍ¡À¼ÆP•Þ^~ÊQ­OjS­Ü¬úà! A†œ Ø}h-Ûin±Ü‡2½j˜RäV¢"¼›Ö†nÖVÂǵKj~ã<‰Ù«_*X{U/ìöày¦;;@êõ ‰”ó@bÀ­áX¤äENÖÀÇd:q¡>º€h 9S2¥°…doâ~%ÓcYpRA ÷Ž$â gnùð™„ê ß4ްéReÌo·éïáÚ IÒøâoýé%Îvä¾yþ&ÇȞNj²eG#)„îoQJNúR—Ï¢ñOÅÙ¯(Z÷>ň__ž,Â";÷ÞáwÚ ¤¶xù¾oN­‹_8)5“´¦ÉrôÃ"¼ÂêÏq b#§u÷ÐÈ)F V’0qÍIº5qëQëÝt÷MáQÈÞ 0Ë&×5È}eżšËt &-ÜŸ¶'|€²¤Ë€ÁyÁ]r¤þ̵íÌyõv5*EOb„™ôG»€4Œ‘ ô<îæãr}tàYE˜3š|~- 1¿¸yøxšyª'Ó¾VJãÍŠÔb` ŒY1‚m÷)-„•Gè5$óô¥·÷:£KÈÿ^ŽÎ?tr•]ÄàÅ‹ÇqëUŒ×^å"·ªÝ½;¦7Ð{wŒ3áètý<ļÍAäiQ~qå¾ìVÁc;¾EÝHÜZ"⇢žuì&÷ºÚh¤.FR‹Zøä`í{ü@Z£¡ü3ž4KÒ§¿C þã×A¨†õ›ˆçÇJ_XSÇÏá[dÔ‚wÛ«'^[ç%À\¢Òë¼´p­˜èÎg.Øx–¦-Ì€by z®“v´Ô‚¶ëIejËNe?""½ên)5×I ëòÒKú9Ov!²ÅÇ×`ï ;¾¼b騯 t[ACð';8ßYh Ù<–×Ê‹Óz{þs9¹ìd ¿árx`Ù'Y'§¢²£Ñ ¦–Ylˡǻ߻·n7$-1‚ǯá>cCµ¼›QÓÐ[ãû+l[cæì¦}uþPnà4®ÿ¢AÜó3lþ°Ò¤—É𥪠±þ[1†´ÅÃm™¦ì¤þV(µ²‡+›·yÕΈ.)ÕÙzT‰N×ìÝ5ë¹ Èql-ᬧQöºÄ6pCF1Ph]§Mnç"¥1gÆP³.«sEU“gÇŸ'YØg¼ewÉTìƒ8µ€”ŸìÓRúc&Hœ×V!¼•òpBŒI›‰»Cy@fúØ\“OOHS#&mÎSü·ÖËpY¦ñJ¶órÉw‡¬nñü}ºêÒ½—¼M’­Šüö´TÉËÆLIðKšÅS’Ð úXç*& “SÐÏàí)tåA%sV¸!(k_D£=è‘1÷ú©¶Í{xgXl±’E¸”×JÚ©‡â‹&?ÂÍjëlGu",BPb]- ;’ñôS| ·]Y ÂÏIÕÎf{_eÝ|„2»•õC-nÁ¬Ä3I JïpGÆÙúäêz·õ%¹¤»0rŸKÇΪÿçPBj~Üjõ"nMT!1. )ÑQ™]–dún–¿š3ØSžMÎÚ¨V­’Áò¦A ÉOÔ@[±„ÜdZ$y|0ᯃÀ¸¿»?£™…0 q„¹têöà’Z·in e_ØqÉÜdõA6o–šx  èDÖ”ÕxDõ‰Mkn–¥¬Õ~T]¥~äæ#“àì&Ù]Šîr[°Y:)a¤ç’÷ (±­8–Y_·Ž¦2ý¼T­ñþLL&§n»ëÜq~–•¯›„mÙÔí1CÈãÈanü÷C´©¥òÀË÷I•›û5YL3k5¹ïv#Òözò{'öt!@û]—:µË•ÔÍŸnmÎ;a)øJ÷ì7?óÀO¼ ™‚’&Ð÷lŠ® ÊE-Ï2ø‡!?;ÉŽµz²öiÚRý”# È]ž_³«)QÆÄ<ßÄ\].ÎnÅ…Kþÿðªd¿=p®žšÑª’gǥ܋ïÕnOû Âz˜¸ Þ’ÀE#5•Ç›Oø¼ëÝv¶Ï0ã.¤(‹Hʶ¸ùí×ë„oÒ`È0„ɛ鵱Dhâ^ÙAÕýêv¿š¼¹@ÔÛ·q3¯ÔfÞÙý2¨míÜ=œuéÌË>4sÄ«þ $û̇¾ìŒÒ‡WlÖ|„ÓôŠ&‹’ÓïãD‹8rœ°HöÔ8¨Dæ ÌìÉZ  J‚Å&ô zÑ,er§bGâ®$Ù~—z'B¶fq•´E$Âǿ١Š^²H0£{xü-vhåŠÌH¼ÌøºYæÂ†Äú8 ò4$xÜø–Mþ»° r}ø Ô‡Ó…õUd*dÔ0§@XŒ˜fAk6 ‡ÍåŠÞÊ‹=Àõ<6ÔcZÌ'Ì~óÉz§ýmåž»2tÀršª“„Ô9±©v ]‘ºœÊ†¯CÉ&ëŒ>±ú]hlk[ÅBæÕNwÅú>ÜÑrW&ÉÒHªet?ÐÐŽ (5©#¨MDèÅ ÷™lÎuãCÎ×ÞXâ”0A‘¾tؕ磂¯æ#§ƒ¿œjJ!ج9©Ž¶.‚cÛiIVlÊPÒUdßå]6{1Ùõ5ÿ å°uÁVdé ÇDs°ÚerQbºç6šõ‰`¦ZÂñœ£Iör³ã¿âJ!?OÝÙ¨¶MÀ¸'{¼ 9…ÜNôEÄÙoãŒGYdªcP;„" R\™°¡]1®àúöPêÄÒkŠ«ïÉ4Â2t7¬Œ/po'SÇÆY½}΄¾fÆLÀIØ+ÜØ×_Û™ZЀC•jQÎÃô?t¸¶ûG…ÖöìûúBlŒ›Rú¨\é ¹+úÐ0ßÚtáWc³@f•:®ºf›mæ,ûαšäºú·'ØèØçÊÌ>(‡H C5„'2tÕôŽt¼*ÍóÏüãf0Ö)ÜJ$Ò"ŠÅÆŒ5sì)›Š·ÚÊ×ïL‰GÜT&(ÓlÓö¿ßp¾$Ê÷#C¸ý˜ Å endstream endobj 89 0 obj << /Length1 721 /Length2 8216 /Length3 0 /Length 8814 /Filter /FlateDecode >> stream xÚmwePœ[°-î .ƒÁÝÝ .Á}d ¸ „` ÜÝ!¸»[p îîzsιçÜzU¯¾?Ý«W×^½v×®úh)e .ZžŽ`VvA ¦¬†2'?• –VÊ læq€J›¹€:`Pìäàr²³s Ñ¥= VÖ.@ Æ¿Aà;3Äâüà`çà±° »¹¹‰»9»²:¹Š²þiÒƒ.Ö` %Ä ”RUÓSP‘2È©håÀP°“™PÍÕÜbT‚X€¡Î`F ¥ƒÐîŸháAþÒäÌú·¨ØÉå0K'{ ²Œ–„¬ªŠPFŠMK h•äÿ´C]œÿ°ÁNöMÇ tù/²3û/2ÿ/ú¯êäñOÄŠÆÁA,\€æ`+í/ß –@Þ`«ã¿¥?‚œÿè2üñ[þa»ÚÙ©˜Ùƒ RöŽ®.`' ²ìj8Ø›Aÿe™ÙCì<ÿ¿¼ÿe(¸˜ýñAjõÇ9ö ˆ³,Ä Rƒ¸ü±ÚÒÌîEã:àîE ‚¸ÚÿÓþãÇŸ9@í<ÿ÷È?cü} ›œö{9YI¦ÿàï² ÔÂZ5]þxiæúø»¬fùg{þóï69þ/W6sq‚x ØYÿZö¿¾#£ÿcIJ:xx³pðqY¸8ø\Ü|@nßÿG®…«“êò·áfù7ÿ{‘À`°Ú¬ƒ…P°MâÏÏE~29ňLc¦ÚL³°s£m§ØkÉÖ1ñ…q¦;Ùx€¹ÈúÑšÂE•Y4cgx$‚2Ìh–ø.ºØÊ¯|åA=ë¾*ÌøáÀÞBáô˹KòâB Ú»î”ôƒrÅ"Ør¦…MˆX«1óÓWP9F#zœú/à ¦2¬ ëìs±»ß p¡™Aë§´ëì¢Ç­PýÜeH& ŒÕî£4ñ#N ï³ĬôxÕ6;’±ÍfØ&CãúùO‰ý?úóxç*1ò»ˆU»7»|cÉÙ0¶ÆE@ôd‹c•Ŷp¦í5 ÔFÔõGèCºɯ­Ïa¤¿è»‹Éÿt^Åk„Ä©yù#üwš3·õþµ9v©Ý(oš IuàðWE¼åFþÉ2ÿQÜpö¤õ¸u¶4È´m—;g)—5ÝTP2'íC7 xX¶¢Êä'!ÕpU®ø³²é`çöK¨¿LLůñÞ6z”•–³;”bSkÝÆ ~-`òóx5ÇKð7˜¡ÊPðç‘NæþûmŸm6DHûf+Ör}Õ_eD¹¥»yw·xŸ?—øLØ'5qœ#Xô2æ.&*%ó"$§WU3Ìçq”J+û<œäCî*ZHmM÷ÜiÞcŒÃù›HŒÈ‰åºxTV<³(í#?e?â„™'ム.€ ¤§~Jê6ò‚}”!ÁÑ})?­Æ °'èý‰oºUF~EÊÒ¿4©‡ß¼•OŒÏa^¯yï–M)ë]Q-iø?j„ìj¯'*aûÈ_Ô»äÛí?|™+]-XNH†ê 4@Âøâì rêMJ7S§4*§åÜ'¯%êRèTJx}lJÖ6ýL¸›¬ŸÃ¿›Êö1Dø¯« ¶ìÎK;N+2t$\üfŸÝî÷»/JjSèËì&ôZ¤3(¡õJÍ奯V_®ñÔê<}÷†¨ªõ/0Hjfg®­i9ÐhþÔTl úú  ŸgéQrò5ˆÇ#§Ù%l_ì{‚ &°µ=~¶Ü£Ñº¥›ó .j/»4 ¿sŽJÊ^Ô5 ÒäGŠøiïGr„VÞ×Wâ>ý%=«u)ÑÍÄ¢R ‡÷Iè'LËé©‚¦ÇÈ{·lsÝ"æË…ì/Ž’͘÷Ôò3ÚЊÍÄÒΆ¤e¯ÂÓëgˆÒŽW3) Õ5Ò=˜Ý€ j–ñ¸ujµð¬ô*kÒ\mÒôý™ù‘‰<¥DA±¦^FÁ#¬œžèô‰''QŒ³}æ¡÷ž*³šy•¦·ZŽ|+ch®þ®ä¡N¼ü}"™( b6…SÜkþø×ô§›ìšŠio*;LrB¤¨¯P‚ý*ÏʘªDéiÊQ'X¤ ÜyšÁjèÛ¸ÑÐ5M*©5㸠dôÌûû³ S/ wóå1—öÄ>*îw`ôJ-2î…m•1(~î~²C4çx»]œÎgÄ¢7’± ƒ¾+óVf¸G ù›ø‡µ±ÿîì1òΉ‡Ä‘2·Öï]æÜ¦Ec¢NSmdiLS®×,@Î1düVk$õ¢/$âÄÓø¶{„>Áï?Sв{>{ÕÝu§bÛÔ—:ÊýNÑ4ñqP, ¤¼6ªb/çìk(BW÷¤+HJªXˆy*ìÉòÝTŒPÎóž1¹¼aÁXy.¨OòäEˆ9BéûQ‹˜ªDîBº°_ÿ£"¦l|—C0ÊGG¤Ö¹ÃÔ.|öfá¨_ñÀŠŸ„TÝF£ËþÕ^ÛYá¬õUö¼„Yh€péxŒ‰…øH- ôyÅÉÇ·¨pž´R®¦Þ(Yú~DŠô{ëlÜŒ7Ùä´T_ÄÄŽÿ—ønÂòfú$2ë‚O—Phžüë ¥cøê¥¤¡‡@2@D•Ä ¿û^Jæfт̻~™ã–½%&û¥N[…O—oˆ¸j[¶5RyIEñ>ŠºÐøc ~A,6öâ3óÈ`S [ä±”×`}ölõXWk¶»l¥ZÂÅ8ÝM¨jómÝ×jy¾~1.¸“_ÉP¦ÏÈ£»Óo˜Èw•êé­HErBr#ç«îj¨êk£‹Ð–Ùh&B¯[«”7@ÝŸšv°7ý ¨á¢° ÇH?eNÄ®l]“Œ:^fäÜ®kžo}C~ñê“&.œášéÍÑ8Üù³\S÷‚ƒ¯š{ñg°ØÆ—ÄvÝÆìÉ~òÔŠl#Ta=¯Æe)[HÌò|òˆ~£{ ØR_‚¥¯2:‘Ö¥Å`hO¿,7}.ƒ3~Ç*Q{ƒf1ðöGç÷ï?Qó;)Q‡p^+É^!RË4CuÂærÉ"èæ(c§V<£°=ýFí”îòŸàÈ»é?éåRà|Ë`8›g#<é!h÷Mp>7P¸Ôãê¶¹ I¼Ž^²æ)ÄöQÚ"~~àz°Ip¨vöÈĆü<ÄAXXg]7Á¥oVõÜ”»è¢Ærz!<=žÆ–À×´ÏõïbÏ"þ Ô~ Âã5·)oþa[Z_Âɪwˆ\ßÓ—gœŠÈÙÚš±;ˆÌPEOéMâ2†;T Hª½¶jÄÝÙ0åx#Aˆ’'B»Ü¶f,ÚóŽy–*¼Â„¸déLz‚ÁòâÆâË|zÆÌÙÐHÚ%ÚCÁœØôMŒãI`*lñî¬yÑW–÷˜Cçär#±´#ðq\¾^`-Eø;ÖÁp¥…uxwýÊ1«íÑ0ÖïÎZ!ljvmr‚Û$˹V‘$…8Ö,…’$ìÜKjÉV0Où•aƒŸnqûÖÔ+£,=GôÓyØÝ¨;ßú>ëÌ2i;I7¨z/}¬'töº"ê*¡ÏñNm^|È—Š¢ëÇ`8¦-½”v)¶¦xÚó·KÜ5 3"ûóKºWç9ŠG«úÆ(„V ਞå˺ÏëjѦÊ®»I¤¶wµojVa‚‹öÆ\2êm.±Ù_$/ÇÖêÔñ3pER´ß?V4NeöTæÆMu¤å²?ÿÈ<*ûõæë!í1îîW¥$á€h3 {b÷ ¥™áZݦ CB` +ÿ Eü“cõT…Ç¥r •”l­—ÑœÄ*Œf˜ê–NÖ„„Jt_é§}óªéÂÄ fÉ0–´MÖø~¦[_¸aò> K´áØ“ËYi8a`woœõfy‹F=²ô§íèÔ9eבxÊùFbމ4²×›‘cb‡G÷šø‚:*ÐϽè]±mF{+bÿSü“?¯PËöD»$,’üÛ^•¨Ahî¸ ´CÌ\ØfÄàÔg¦#J²Ëû$XuЏŠÍcOâ•]¿Í6kGT`zù"‹þ¹ïùHáÝŠÇ»/®'-­,»îÆô‰Q(†V÷é\Åô’€œ¶µ²‹rÏê Yâ²#Q b‚Ágg×ù,Ãü ïsÞ£=•¹K7‹>M—ÛЃËñÜ÷Ÿ4«–(¼øN+Õ¸ÞA5_‘i¤!mâÅZnk¡°ìÇ÷Ä ]Ò'ÔÉ©±³ÃÝ›4…¹“ÂGPòo@gHš`!J#wZíg+9÷á9ƒÝÁôQƒóµãH] ôg»ðŽK×PO} üÍsí'‰xª:Ș2îÙïúœü(ÔË ›‚¨=FrÓeç, ‰Š•ÕöFªB¦»jc¡sÑTàìVüÔÄ…|ÿa[X–©Ÿ»»xôÇSº¸P„xXîò‡\Ef¸x‹Ùés>pá¼á9·½™ÕÁ—1rå1؆é\ÛÕN¼ÀF1÷kö—äÙ­lЦ˜öæu¿×ÓRó|«Sú°-D¹³’ûæL0o¬ŠP4Ç‚ö&šþÁ5k‡ ¸qŸFßÅE¹jªcùÙwo˜û'¾Qž‡'ÅßÜ'Ú…W(<“KâïªaôPý¦¶¼iá;ɇa}œ”÷mwyOT¦ D­ÍP3ühüé[¼N7%^ŽX{!ÒÂÂÜ2̲”gÁA„:9ÒyaÛŽ'²ð_ëg°*WS†XÆ AKÕLzÜ¡A"³Y{ñ5|?!þˆ+œ„^æPIìG5y]ÿ‰òv u%3‡Ü‡f‡Ü¨â Ue®ZZú¼ý>«“þCn‘XÊ’mi꾵ݳlה߶J;–ük9)Ý·ÑÁLª.ö|ŒîJ(K¬,ñ’ÄÃZ½±V.t}ûÁü%´w}WÄo)íïùuš}ÈeQ÷S±”ý–bÉ]žË±(K„ÖÛئj¼®Â‚'í.÷Y»#£°l]û©šÀÈ•'´ý·ù(wYÌ*f•šÃóAgv¾SÄL²+5¿·p3§­(,+¯hA—‘†ÕPŽêÆ4Ô'Ún ¯aIÜ%à¨T&bœ+M¸'Œ‘³õ€ µ—­ËyÖL¤_›Þsâoqãì;¤Ÿ¶†¼&bôS‹ŸÑɯnï¬IËŽË_Ñw|¶'Í~8–†E´¯:‚o[^C¤*èÞqˆ,i/¹£zõ¡]Ñ…ŸÕ+qm…ëim \Ä' ±/? ( K%帴ˆ›w6M60'¾à7 ³p^í*ÓØïˆ½$¯ªäZÃí—R\il»eèo¥UÝòóiÓ° ·’¿¼ŸYm²…¥zgx¨º¿Qb*Ü5Ø*DPâ êbÞÔè§¡Íeˆ‡û•VQÞšjP­ËÒýî ð´I± èÑ4…°ñqŽÐ`°÷ÁÉG´cåyyÌ (0!eÕlééÌz²>ófÉ0QøvúšðÄ_SžÎ[5æ°­ÊÄÌTœk“ ÑIˆèuR©ÐŸ2ÎÙÛ¨îŸ.ûÃÐ9¿Ñ â™o!ÎÓ¶«ˆN[?FR*s=Ðh÷AtðÊ´“dÂwïÞ»zübÆÿ~©ÕL°…Ñ8Q*‡ãRþLïºZ€t¿8S‹¤üÏû¦bÕÜÖEZÀ7ŸÓ0duÊ®åÙR­RÚyÝŠˆªMNÕ¬w Í`áD­W<ýÚÄë)JÙ6°ï¿—zù¢‘rèÌ•›ä÷5¦ªvõºÍ?+¥3<¢Ç¶}ù.^*@Ì_æŸ[ç¶ÉTì‘âýPhžÃÅí?¢ÒA^Tˆ~aäèø3žÀ£é=í½vŒaIL¹š—ýfV¦Ô|Vú Ig.ÔQ¯¨´­Î&©è$öh7Ñþ>‰Š—P‰Ïý"ã¯Op\7/(=€9ø+ îKœTB\¿–0¥ f©Ï“}wÌ‹bP0ž§;'öL±œi?ääÛP´“Opür¨!:§ä –âæ:ƒ_=/œCl¾Èˆ_Ú° |ÿ6•Li‚!¾ã˱n˜eg ¢bf6íQ¶Ùª¸÷l3¹µTú¤ÔdëÌõ“ã´“ÉD_sú®¶Ê~ÛŽJ“¶ð)8þŸâË `6ƒ€•' DA¡¶œ^ Å ¦œqgè:ðgáÑŒuªšXœù«-t…GºKØ E÷m¤ÝØKµñU$Í‚wq‹ÆUKB~[„ß²I–‘ã0unÊö¬¢ ›ôÕçÉd#†m  Ka·Úmâþ¬>Â`6NBxôVãB Ö†ŽçZLË):ôr¬2ªRvzÓ£åƒ*×V.N' ®Ã¢^×5ŒF>Üœ³ª>Ýá ÚŸL––e4$| ÆBxbkÂñ5•Ç|]Ã.£êîÜáùö­Ö0(ˆÖ>„öÔü|qët&³C.4¾¤,d ~ÇE1›øûãž ‚7Yç§ÇL±š-±Ó®0Cªl-Û¥ªflDÇÄ'œj3&Í— O*Æ+2ð¦ïëtχ[Ÿ-"{¿*M{j߯%#ìHsÔ¾nQK®\©2Íê6ÁÎñ9³Ÿ)9w(å§ã˜éôî¬âüGσ,dÓ§v™ÕºÈ‚Låzf†×ccî[D³ëÃ:¨õN|ßÙ€‘RˆÚ çíc¢˜ñëÓáŽæÐAζŠåQ?5,Ag9¸Î-αYj5r¡nø‡,í"åúæ•@X‰eÔ6"ž“?Þ¬ý~o±ŸM”[úš4‰Uw½`~€K@F/[ªq¨Ôµåq‰+ˆZJ±ãµ%(ë‹R—šò÷šµ²³Ý¦ãðs©£:‰fb5[ø!2Š]n5á-šR7Ǿ;]z™b: ‘C󫯦ß>†²ò±3ÛFÞ ß$°Ç|?dÆ¡¸b øý¹ÐÑEªð,!:&Öf%öáýOîõãEBÚà7 :C™ƒ·ûZ^-a8Ôõ.A±Ã¹tÜæo@M. žcõ#tè—Óx«ð{;W¬>Çoù^3JA&ï ÷Ö1ÈŸ\G"‡Ìáøæ(ó{¥éêŽ%«†?ÅpG*"ÄÛÝÓx}Lšë…5„ØGòåˆpCž(×Oqä>‡£58<ªÌäuŽSè@³é0 ¸ŽÚ‘õë Ç¢+ˆÏj-ùVïÂÄ»¹²Ëªöo~åöýZË+*42ÖF?c¦aŽ¢4ЛÙ=ˆgP¦pð¢b~]h4â3‘ý’3…àZÂåÚwü1jãÚÔðÊm TçT»v<ƒzcwÇ’¢O\e]^”-:åá“Ø¶ÕËÖÚ²¶Üdž.޶=ºB¿áÖ ^ 8ͯ, 8Ñ©zòñH¹ù••즃rhU‚L{]–lCsè2ĽuK†qLS,zw_¬›Wu«9õ¾h Ø Z<ïzÒnA{ëÖ¶'wmL 8žïk^Ç&ÜôöúšÜ¢Q‡A邏<ˆü¿òF¨ÍÎ-J;«Ú:Ô©]‹~¦¡ù]nZ^þmnÐ<³çîì7u€œôäÔAFžVCƒ¸À›ðÀ—JTOPZ50ØMÚa|“/øù?YI³’:½’Á·ãFÝã|<=Π#FbS£çŸ DY¬’Fˆyû6›³¦n!×DI 7Y\B ÂGF£f(n¯A×S~ R‡ãïÑáß-š2ö|÷2.÷€}ÚÁe9†<ëûèlÙ%Øýg7,§«,ú]-ØëAk ܪ¯Œ ´+W~8^¶)Ò°T´Ã*ˆ¥EÎm↷O£*Eª#ÒÄu°iÍÿÜD„k˜øðÍq=oYšV˜ììØ(ö#îpÐÒ¼mÕJ^ýB²¾‹÷Žñ”wfKÝ›¦_‡c½ïm¿já¶6Yºt»¡ÚÝø¡ª(¼ÃäzÝŽÊ–Œ2§>WËÄyM{‰‰±«­‡¼ªÙ?±$^…™Š•àõ —ÛY‚j¼ÅÇd/¾ /Íy‰ûÏ>óVž¶^üˆ/“ty´‰¤éd5¦]4ËèÇæóÜ•¤þ¢‹]J@”3×èýÆ0d¦+)vv¹U ›}=¡M ’çÆP2>ÿËÜ+›i=#…jóhÔg÷?ÕÒ¯¤À»žñBL¢-IXxÐeS͉„(«« Š¿ø¨;rCfæ{rí_!/¥j73åÂì,½Íïúm·W>ýlé=ßS ÔŠ, ¾ÂíP]¤£“†c•WŠ@ â%]GKÕ.Š‘Ø¾¼éÜMSÚeÇYW\‚èk#¿È>ù¦PïJn÷D@ôë~ä^ž•ÃJ¼!«ž(ƒkÉÜ=½1Xxk:aà,õZcnž+™:ÉØ¸¦<‘=Rü±«QÜ^HÃ0ó’vJG 64 ^_`Wv‚fÕÖa‡…o@i¯¼/`U1|'_ +ùa×ÜcEG(¿Oö\‡¡ËÇ¡_o¼ò[ €¾ß¹ó¬$°˜?hÍ•|pZro· ¢QÁh©øt¸4^Iô:E‘Ú=“\Äå²Ýýq-<ÖúÔd=‡Í y=D£ ŠJ†Ç¿Ý¢\­§½Ö  ÜN0ߌ!\ÓÁXPÿ¶9m„}WyÁfÂx»™Á…sx|1D¸||Ù ú± x$éþ,Éó2_«©f`È¿Uùæ ú~üB\—ˤ~îJíN3⛡H[àa¿ðã/îÏ—9ëÈÙ)˜ñ JÁ!;oŸe:ýq«)YC¶*íæHßbv8ÉzzÍ鿦ÛY+ÏÕfi‘TtÃ¥S噉‚J ‡ßÈ-†ÔöꩳÚíÑ~J×ðžH¡oRµî’õ°(ŸÍ~Õð¾ÚÔ?\aIò6Ùâ{B䀶9œÆtØwb~z"1õ0Yb˜ÀUþäLJ OÃS3á®ÿ<Ú—n#K9Hg•ßa¸juïX¾§“•á) Càq ‘†òÅÊæoWxûè4÷ G^-rüÆÄ ‚ï_ÔÔ-¹hï4÷Æãñ“ߊ¢Î¿":e9[E¿îjÍì2j#ñcë;gË­Sß·G3 ¼¸íð§ïJ°ÒÙÎAa/0ȳp1iÙ„kPQÍy_í—´µ˜sÈ õ±ŒÁƒ ßÊ«ú½?ÏiÀ¤fîNæùÎ ž”<‰¶äHÈ¢ÇÒ‰Ûî-?-ÊäO’2(­²Ÿw…©åUÕUW)oe0×c}¦ï®]8Úð¨ŽKM‡ÿçŠoœi €Øµ}ýt)×G‡ãÙÖ˜ÓŽUéwû’d©ÊŒ-¼ùyŸv=öl ë#çË«±2á—ÄiHïÐP%‰µÒ4 š?ª#³ä)z§ÇxU„Äu¿³.÷‘ŸK¥É9:œ{röb”ä~nŒ¼ØÒÍ—îFöèГ~ã!!)ÞVƒ«¡9[!¥ª¥‰Ò#Ùâ{»)M$aªíÑ¡Ô*{ýÝm£ª-]°p`Ê[Ë>ûäKHþ‰íÑKþ fËËé:ôb§ÒÉ|©K8 ,öX›‚×µÕhߊR0m'Ã2‡óïZ$âäP¼ý9µlþžªm> stream xÚlºctnݲ5Ûvž$+¶mÛ¶mÛ¶mÛ¶m®p%+¶ïÝ{´sÛmóOU¯ª6zõQ?Æs’‰ÙÛ¹¨x:˜2Ò2Ò1p”ÅTT8 tÌ0¤¤ÂN¦†.–öv"†.¦\uS€²©€‘ ÀÄÀÀC ¶wðt²4·pPSþ¨ÙšXÚZ:ÔìmìÝ,-€ –´º ÷·ÿYMÍGMSœ‡RÆœHG‚±/bÁR6kÏØ.}ï¶/‰{ǹ——en!%/KWj¡bƒ®Ž™Óa=+„d~º ¸âNMŒû´”öAiiç6üóúš|ÛF#=þÕ…[øs„šŸ €»0Ò¢#Îl,:»R Œµÿ ç¢;Ô fƒYGÈ ÿ“ý™€ý˜}k2gG~xn-ué'ÆíþÓ°^ZÕÛegZ>)õ.¿¿HÆò17„®ŽÕ˜ª­RY``ÞìŠaCqÃ5XU7bìïY; éÂGiAqÅë݉F‚6‰ši:ÍäñÔ*iÓç ñÂ<'k‡/f_è=_åâÓôõƒœ _b I^úCŒ•êAwŒ­÷|ÅmËÁæžj–+'bWÿwåÖ1ƒÜÝ6ˆ÷'›œ”?[O›©„l˽Øþä€eó»z‡îVÚNh$Fv•<í@Ñ9g[×éb‘¡X©ìn˜#žFQ8ÌÓB×pÙ<‹Ø5çôIjG9w,7’ ï 9d*MeæHßWîNˆ’Ÿœ)XÙ½ dÜ“®ÉòþvÐÔ ’$ýߪô‘pG÷µŒÓP Œ gOÁît„Å•ÚM»†àY¤¸â®!¤éëái»Ì}ÜíxäCn4D‹a,ûêÎ2•²üB‘”}ÊŽŸ•Æ{}|Á`RQ±)üPŽ=‹ZI RÝ® Ÿ#:Ðñìû-Ño«É“$©CV\±T[ÙxÆÁObFê¨ÿûe,­Ñ‘;g6''œÖ[8¥¼u­‰·Üt/é:ËßcŠæˆEÝn"@Æ1¹¨¸\?Ã:3Ý ¼Yú×±õº¦zñz}+ûÆï ŠÉÝ`YÆå-Ø9d.+g¥D}ÎýyŸa¨~ôÜ?AœüMttû­W4K—J3UÀd$xEg׿×ãî´ShÌB‚Çq¦ ½ÖËÃçÜ ;}5é ªÍ(ìíÛWœÞnøÂ0 X)Øáµ°@FàªZGLÝØõqüZfž[·¤úa:4ÞO1Íš¸;¬æ_ FK"_ïQR½§²:•âBœgj&óH®£)“jX#2pçnuºÂeoQRøOààTÊ0“šJŒ¼°ëx.{¬Ó´¸¨2ÕÛyð÷ž$êÎ5ɵ6m EÌ&þ±ñNÿúÖÒUsÒñK¥x‚J˜à¢í:…NRJeßúæÂAF²H­ ©¡ùáìÇW/°‚–6lH9‚…«ì{Cð^‰uúéøVÆÌ…°ÅSœ@€ÉavÉŸruO³°'Ë÷´)&ø9y|A:üa¥jë‰8WvOÁó•Á1~Åfq#ʽäíó©¡iÏ4ÁºŒd1K¬Euõ¹|Òt¨’¢)‘²ŽŒ[ϸ†vz‘)õ[Úæûuïšh[!‰/ÿ²5Ç„Å'§\zé´ŒmŸùXËö\í9àí}Ħwáóâ;aj)·ãìÚrH…?ixAï|i´HxÕÊêüµôl¬úC?4¿’µOc>eÄ|ìÈ@ dXÀÐ&–¼,XUÑ×DŠqÅÆ˜i)•Ò:×]ö–y˜þôª&±µÂBÛ!¤ðãÕ¼ÿš¿ ˆï7n.X”¥jõß ä 6àÎFÔ1ë8}¦T+ƒEÙœ½Ÿhe7cØ-éNÃRÖV5!3Él½H*§#­I?4p\¸Hçj(«ˆÈ¡„qbÛW“àÞ_Œ@ýfÍVk“oÄùÓ/ÁÏ{z<²¥~¥Ó^’>'÷îz¶3dÙpê5ºp±v²w 6Û{0Ä¥:SÌ!ŒýH)¦ru5Y·H7™×.ZTååøÊÜÚ”-Ÿµ'`…é~ÕÍ ¥^& „Ÿ³gl¶¿'dtϱ÷ô„쯚W÷¹ÊyÎe»uì;„І»#l­Šƒ5RðÛVpLä‚=Ð? ›¶öÃ&#JtÿQýuà ÜN!m™`xX5nÒ±5¾¬S>n¹&[Ìn¥çÉ£k·FL>ð›f µFúJÒs¹¯ÒDÎÔ¸C蹨5¸ÒfÚµ„ʇ§›~çk¨@työà‘æƒ®¿~Ün A«f÷T•K$~5æªZ7ï½.ªž[Ú¨°YžÚEšŽ·JþIöÆ/Þ\I1$ · # +Ýþµ5YÅSÇ%_sF%¿PjDÎý=@jVû€úþv©­Ä5èœÁv:ÎÅ—J44­˜jõÌ‘×ÈÛ¸ÜCîdaÈ^-¯11ɉ.ñJgHæ²òdü-üúi«Ls.·U’83í7¸§Ò n6©œm#p_mJóÝ{ІôQÄѾò„…rñ«Ù?ÛjÙ"'›ÏO6ÄhÓéåDww€c“²­ÞvËÒ²þ‹ ( Ý"O~ìÝà»óe‹i¥²ÉÝ#‡‡©SŒ9•°‡NR£y^ ìÃÒál v›Á1Ô¨Ætw×0m» ã¯©L \–Z.:÷-À¤¢ð´›ˆŠÌÉÛ$…NEU%³hÔä6`ãpîØâº_ª^Jó´d³s¾¾ûãïCgá*µ}‹õ胵ÿ³5å&ÿ§×A\°Ïq€ÄcDRø"vg Æ86 TKFìŸ;[FÁžïSîž0vRvûÅÏ›ŸidìlëY<Ô‰çQMnÑ!/—x×6ËÀèô-  ‰‘öûREƒ¤æµÁG›DhÚ®$çå†UýBLúÕ–ø\•E.O7L?P?äs†p:ÜÊ소äøÂç' ­«þ v#7'…nÒäG3+ñù™*ÁÝöæjb.\ÂvŸÞÏJ`Iž¨ìTjV3AººË®`ó⛳•›Ñ—”œ}ÖA&mv¯ŠRÿ¶Ê_¤ÄaíGJkÓÚ˜õDâ®ûÎÁ¡ s‡`§A÷õUå§aTÙxWxH'”¹@+-bÁ«y)mY%)¬ÞØQ-F¸G¼ãÿ÷WQ³º­0ÜC.œkÒ‰Ìêx³ BVesi$ÜSÚÂÇw¸QR”“cog#ÞAMv6ô5A» ×rcä¾cRdS j*UË´5ꯧ¤@»ô~*±š%³ P7Í—sÐ,–ü!o,l,<ò¿LèJ‡FŒá¼OþðKð¯þ\‹C$W ±š¿ýtš™“ŠwÛ·;{·jî 6¹ÅM‡±µÒØ÷rD¯B_ˆ<ýÓßÔ93<«*Þ[I¢j¿¼êØg&®°”±ÅžþÆΙYµ—-l‹°\Þv¾M×™çîæAaÁ "eA°ÜX¸fgå ú”͘]t8JÁžÇÆs òóÇÀp3^-£˜¾ˆq˜¾[Ÿ­* 4¤q±ØL/S?Å~9+VµCA¡ {§†\ð)!sA¶ÜíÈQ›”ˆls‡Sm%Ê*˜Ðö»¼Šú,pµÝ§Ñâó.-7?w„/ "ךþ^hM¡â?=äGîÚ›JÛm1!ƒAY±¡íÒi[ Š[Éî$é\?ªbš£b=ùÆp=!Ѧé|¯ŸH'¬RiFœøÄ@{e°8jÍ€ 7îd-8Ï–_RùrÊ»tAo€­ßºŽ>¾}îdµL¦7°ÿ£[ê8èï’‡²ŸG¿ì±4—ÞM&ùü½§ÆM#ÚpT¤_ØòõíÇ¥-m÷ÀðÛ¶ˆºá¯èbI†¨CÐ^KݽŒ òÝï~·ÌÆDÑ:^ÂÏOD”Ì%ÿD¶ Œ‰†~ègG¤>ªÊ¹9†Å n{\5Ôæ“͸~I‚Ñre’æÊ_:Í1 ˜çø $—%Š4*îF yÏiƒ³Y'·îÙz$2&?[N';Úæ%¾‘#Í»nÊx;…©ÄÚX¯@ªšzׇÀ˜¼«¦Rz›¼šWe<7Œí1>O¤ø<6»–º›`I¡Ÿr’ñhÚ?‘aЭgÜ8Ó1/ã˜Òx0f*È© ¾¬ôÏ};<_9GÛ9#…A¼N5£fÍ]Â…Í7÷4:ø¯ ¦ôÐ…(8DÕZ…ÑÛ¦㻾#)sS\±ž8ÖáÉ ÌLGEʤo¬!.‰t¤°O¸îJÍÐw‚@o~„Åœg/F·ÞEê¬?,ɽ$O7}vÂÓ9%Σ#kâ»~âÄ“íô-ÓÉDÎF¹BL Ip¹$Ââô–í’ùˆnïÊX*7Ì8*Ãñ+V„§3<³é˜Ð±ûžOž€V=o•æÈJ2183,&s€áq6÷YG…z-}ÎC©6‘DŠåLø \в}³¥z›-Ý×DˆxÑZèÞÐ.ST“;wú)©Ç¼%7®d‚*MÌތً¯äi ÖÃÜqÑ8ÔìUp p±wõ›Žžê3Å­NÈýƒÌO€l{ëãn?Ÿ/ªò@ßÑG_ GYOX¤˰¾ÜՂɇElÃñ«üü…¤ÿ.óÄÒ.tLIôoœâÇ•‡Þεƒå= q='¨¯DšâžÑ{]—ª ‡ µ¿r.huêgôòP}Ù¯t«UÙAµé4 þ ”5ß—¿x— #<Ïþ¨š¸7Üã'æ;uÈ#! ,˜3$ ¼¦EDõ—SÇ¿7°bS¿0ÚC(%ªË–±B}?ÂwÜàWG76¯„©ãgkã þø´×IüšáZ<  ûÍm+\¤fšÓÍÂ|™!>R'–¢3nZGñÇJkZí>W:˪'œkÜŒº>ï~¦¼­bä ”xý ÝWƒ*táƒÌ«Û::p '?ÞõÀ'~ÔÊŸ[?Šà¾sT¸-"«ýRsœ\žŽ ¡îp£.»q< ¦b²Ë9¿Žò ôï¤Íg‰c”ý0Ö1Q£… N¿kfv8¡êÚ‹ˆß)£ÔøÖŽB¯ñ0Z…fƧŽlŃ 0SgDؤ«eJ>¬—¬c ƒïÚª¿tk¶G¦hkÙögQ64éûõdi{€îƒ]@p“^ðÐúì­ÝµüžŠ=sx¢nÁ¾W W4I„Ol—µÖ0ç&u2G>7Cê']‰÷ƒ.*l OY ~µhÌ]èø›Kã†"(dÈÕ÷ ?C`Ï¿‘;?K3±T9@Sãºñœq5Ä vûæ8âBŒ%zül>=•(‚ y?ôhm‡»žPbàö¡ƒ) A7 Ã%òiä÷ýìP@@á3@Ì3šq9Ó6Ê“r„$*)»M€ŠÔš"ƒ+{q½¡.òŶ–ò¦ˆÛq ¼n|Ú62g| 8µ2ÐobZ¨ÛwÖhv8‡ Ñ.lˆró§-¡staÛ¼¿ç½A*Œ>© µðå:çY[ù¡eH¶Iú—íåö(ÑY/Ÿ¹”zf+xLK€"ï¤Q­áÉá–]»ãp(RQ8³keä.„çVlSt2 ±Â‚LfbìÀ~ æ; KnIt–?¶%Moʼn©‹‡)í—ï–ÿ(ЬÕéˆï;áÔYç {¹Ü[•u«ÂÌiÅX§µZ›ÿä$Pœ‚¾šÒ[ž½‚²H[ÑLT ÈË…ÑX‰Ž6–šg›£UÄÅôá¦üÅЈSaÛ£z·€c‹s¢R·e-ÔVìåN·zz/¶Ÿ#µqçæ%'Å.:ûS¹ 4Á¯gB½âP7)'ógØnõýS⤨ß;´s'Åèw=Of—ãÁ¨‰Gò'¾ók>Ymš¼ £¤.ÄÓðÄmÌ•þpÏ &³Ê¾ç|¼hýk ÿm2_ÇgV.¡ª£ÛÊI/ðzñ$­$ö"­w‡¤É_çwÈötxL3gàÉŸ¦Àj˜[&ü ¯†z£/‹žõ* ÎUJªO‡!t…çûȪ…œüv ëd£´Ž âÞ0‹Šò©Is‡Q°ñôæs¶†ÑüÚ»±ìC¼~œ7ÔïþAQ¿¹:èÓʲ4ìc $.M.1U Hþ |ôšz•ú üÎŽtTl|D§¥«¨÷ƒX)€\ÏÁö/rb?OæBFt0¨I£äFÄÊЦCÏ”T“Xös1í^­Ò<Îb^ñj+’£ÝaS©9Co{z7œãd¸Ä\>#Þ‹Q:-p•eÓ2Í“*˜Ú°Rú7<#Zg¡Ú¹ìêÕ)/晞EbnAÏèa¯DŽÅzÏõÎ ¢:Ÿº^Ý5'ãoîòg º‚ãç‹2|<ôy\¾ËŠåúh]ž§q«=M,!RÿVåÓ×ßmò #+Ý~ù´w ×Ñε@àbÂŽÀ‡˜+ªø™†BÇ_µ#F䚆EîŠÓ~èQãé‚j§Dá†cHnÛÁ²(žœØšqoM3Ò\ûX0»áâC"€{u[÷ý€ LÀ•¯ìÉÛyD•D œžˆ(d­|kå:½^}ß\1fÕ0½w´øTœTS1Bà&àm$O"¦é' øà”<”MU‘lö¾„LÍÇ\ÀZíüàô¶ð¾F»*mÇ2˜¡Ü{Ù±œ°rFæzþ½Šœ­ÈHÄ\m—Ç£]µHsf[§mÙj&•ò æXƒ/òè½ñYБ1ðÇÍé‹ .ŽX³·áSƒwgxËô!U³[eñ¤T=:ˆ¤§… ÒÍ «gE¨Aƒ$…T¢ˆFà…™)_"9® °C2PN“‡0ÔЛ‡uYÞPØOè%̇†¹áŒãtñIÒ’;ô¡xÙámú×a¢ŒOæ£F`’œš:Oí½.»B"1%ÔoF[öâìmƒ2^Ýø=Þq‡ÐºÈà÷@™VÝ<®Å+ÕèiE^'ú~%†P9ÓeV+œ.åB2‘Ð< õººúKaû” êâQ0K˜ÉÇZþTkÇ2¯mþoކ§ÂãÀJRÐ]fߥ÷Ëdô‰µ&Çø‘bÌÑ?Æ1é×Xf‚•ªžõË»-ñå:öÁðíŒÏ7¶u­§ÔrV_DÌ¢šÓñ, ‡°&Œö¸ ­|B¿ ƒœ@Ëë¯w¾ˆôžf–þ!¹¡Í”V×þ}¿V&aÝI‚ ípɰHÑ:öd¼øáuMA,Ã(×SºBw¿?âlY(”abÖa´é8ßvjãTS¶ú-Ξè ‰Ø…Ãe õ½šÃ(Ô3¾$jiÏó(º‹ÄIÖ+ϲÝü^ŸN" xã. ›ˆí%k’úf6Ðã í©‹ƒF> ZŸ¦1Úo¡í¼4–zKŽèŽ ¶ 1¼9šñ–IK#ï.T€ô¦ÖPöÃ{º2…ãOÞ]59“º=a;JEw¾É’¾‚Û“&ÑùšN'EBâÊpö2¾Çån™î>ŠÅ¾ó#¥< ðÞP[ù þe˜*)iUŽ-…íßvÈ@fjøòóëø±:×k ùqº\-Zc‡£üƒTS!]„J…ÎT¡öi‘XÃ^¨¢ùTɈ˜Öúƒ¬¸×º.¤LêpêWV–¼*>*f´ÊwBµçm¼Š÷ ²ôu­$ÅÁe°iíðàú˜µû6ºÏ¦ ŠR¼šþlé \)2â pwÄgÈéwùdòUûš”RÍso²ÜWЯ…·›#Ѳ+¢ÌS“\ÜÔŽ¬ŠÍ¾ÚXÛvÙ¸—·iÚ6"Éiîe‹óa|zÏG¶qÇpc®g©záÒ´\¼áo/r“&:MÔ¯@ˆË›oí ,Št«Û[a?#ˆ‘•X jß@ð%ZÇú•éª$Lûo6f¸'7"‚T/é̌䚸S-Jí¢gQ5IÕÁž<~·NÁuDã©<Ýíõ5@µRS IãÖZö,,mj÷²6ûe”ˆܦ·v¬FmŽªÅ¼€(ìçÆÛÚéÕ” m Uî"uûz­ëµãH÷Û˜==AŸ«ˆ€gï¸tù’îÀ‰.Æ‹.ÕÑõ»uˆ;36Ù:ü œäs†VH‘ᡌÜ922Ž ‘dR©`Ü\3ük0pME¼€~ý4nìÅ@.w\9p8¹(G¦1ãÒ]ÏPð뢜G‹Ù}yÚÉÃú¢WÀu xVðÜA}¤þ¹AMŒkÕöûð1HT'Be$’[Bç’¯ý2ξ¥™:²~Ñc¾¾ý‘wÂkŒ ?•YlõÙ7U‡ß,u›Ì:¤ ‰X÷z/ wï…Gµ×Ÿž8´0a¸UÛÓèšûþƒÌ¼ä| »U˜šéz­@HÇæþä²P¬}ÏÄÈ9-X©ÛârÞkn —CÌìA‰Ó…=¢‚2GjÍ$t“!rí9ÙóÆÊÞçJ7bøC¤žqCñCBä!ê¯Û2¯©í- ©Þ‘¸¢)Ð`ßX—¾zi/°×IÐj„)º€b®y`ÙvY7ÍÅu¢›ËE%›\.gá‰I8®-YÄ7oAøïpS‘ž•!2ÊÙ^>·oxv[îB/‚4ÜR‹DtC ÓîÍBÇû<yêÖÆ+Ö¹Ä|Ü….Ñ¿êâpâKºÔû¡ˆwý+ÆÌåŠsºH óÃ[퇹bºôB±ý'Üj,ìeC´Y†‹êŠû&’ƒœ'‹© •ñóœ„aũݫ¤Ô-¤y–äÉ#­Ú‹µcªü8p›è)7öÁ=¾Ã‡ØoQÑåͶ9¥ éãé|)‰&p11³“ÎθÇ69• |Ǭ&ì`2&#ýã åþ—¨•WQáºßZ&T¬Væ´×½ l@2°8•Ú£ùþ®9T C~ñ…(}z¤îD_ªÎe“ ©wKÜå€È…«ó` ‚•¸ ¯c ûÐ{| Iôa8áRaX{…ë[r.t?|–Þ^÷IÇ 0¦ÅCéíK=‚U$•Jn†Ómä«­k8/:xmxôš)V®èȯðSþ€€ã…Zf¿Dk7MªX# mñ:DQ£)†}–ÜÃÞàØ£=ÖÐudÅɲŠeÑç°6{{^á&1ÑpŸ7Ù\ÚŒÐüíO° õ§Ðʹ锓ÎädÊeO´/sxËfÇ8 |á&ÊÉMæ=mëz‚$BÁ˜ ìp[boÜ#µ8ß|E$îÁa¬ÂÔ½ÆÈJ°uþBîZi1Ö†ÜÌéþîóE¦Ø€]N¸báöí#œ¤Ð ±ËWÃ%¤A‰68výOE ן mÈ–Ø?æOd•Z…%~[…å^Ú4º¤Ó«09~×3P¾ 0žíxÔ%¯F\Ý‹Kbi Ôn¨ài­/Ûé~.—jx1Ôž §Ÿ ˜|Äjh†T«ZŒ%mÖdÁºÚwåˆmûÈ ·/SÑÚ,9ȵaa‘Zæs#÷ðá‚—«µuÓ5Pv+ˆ¾ ÓW ´Ö:?ƒõó²á‹DþÎÀl6¡Ûõ”Ø»ø€íéܪÇðd€ÐÞ.Üàý,wï{ø×‘îg‰”i£°õ½ƒ%;à– ¸PéòNµØÉG0•¸ÕrNõö(Æ 8tÜö'%rõa»ÌN®`<å×pÀ’>š 5O~»¯Š! ¡ ¬‰¡q3]ƒbeN,þ÷h§Æ[LøÝÃ`[Û:åÌծܜá³î¹ùeýßkJÊÛÕ›ó=ž5Ô,ð‰ÌÖÜ驳៓‡Á(c~…‚hÏ!‘y$·§•Þc½QÌ_(ç§¾“k˜+(A¯Þþ¨ÆÙšÑã$Ê ?n¡p3´èOkˆ€éÁ¡Þ"w±…´ûyŽÖçp!jB]AЬóS’’Põ ‹³X!Qúl(œðvß ô¢a½ò©åjB›K$~Y l+OcÙö~VW´j»ã>Œ`fþœ—’ÝsÔ$\v;ˆ{UVmj ï0+.§[PeÅU ÞnIÿ/Nl„24÷j¦U1~ÛA¬ø–^qx¡ ‘´£…vÙSæz¦Óµ«àé€t=€æ·¤‹V‰‰©D?:~ ÷è¦hT<£,ëºOñÄþXR»ß²5ÞQLóÒüÂ"‰7ÿŠàãæÓbN'E·¨¯öW‘ ·ûÕC[ö(bE6*!›¨k%”5g¸rçRõÍy;÷emg>Vo O†T±I.!èsN9랬èÄNp/Ÿž*†¾Lwê¢"|á‹%Ü߯úRZÓŽeð‡gJ,þ~„6™Ó-©(^oôô„6…x&K8Ó/U\S§Çgþ?oøA Ó3“jë´÷„¯_;…o‰’$N+5’¸Óy¬†"ëm‘9ÁBÄ‘¹‰¤‘ŽXõãž2‹±jãŸe~8þ>÷á:QÐá¯-³”ÄÒ73}¾¬v¥ž³_yûèà7‡š~šAñdFØ„ n¶IªwÃÛõå£è+[ÜM™™n˜-2­{Nÿ9[Úf@hsªòT&"uŠ®¶£ÉŠÛ—‚W­\€Vs}þ­Š0/!•݉îH÷kkQË“gYê)þpQHcÝÐÇŠ 3OüLFZ%ßxËõæïUO%R>÷ÖŒ :ó3-ÿa‰¸Ùþ^ÊäW0 ÿìESbt¯·*³µtÿD ÅO:>38ãÙ[ЪSØ,+‚à­ª‹åöyc”L…Ó¯õº¶ ø{ÁIê(5šê½ïÂÈ:K!8fóœßÜR’‘ÐH\PE¯ØMr¡³Ðà–ïu¼YQ½N©j\ü?7ô{B4L‘áo-³‘ªòãP§v»¢Ã•Q­ïŸõ;ßÖ,©V>’îTT=±x|û£A.Úÿ=Ô võ~jN‹lÁ±.êà‘ï’|oS2ít›*ƒPZJ…xj÷ÁòÞ/ºkÑþ(VÜù¸þò°ƒ–‘³ÐIôyPõ£{›¶¾„#‰V½«¬=8ÙGý|È Fó%N©žWöµ€LÆàÞ(ˆQÌò2l¥Mî¤|ös]gî80B„Á2›í¾â¿cPÉÚ[0–5ת¹îjÛD+[pý}Ò“¹ÅPŠBMÏS“s WÛQˆm¤Uëݤ¾š|ª}RÏzXÙ åOþNd0tð?¶zˆÝ„èmDÌÏ­s‘e¡SÏ )ö–öNåƒñ˰…ZWN]zGKiPánà¨_¿£$p7zÝ)«˜Â”´ÕAköeÞ@q·Ûz..g$îm \Ò e"p2êí Üå䮺Ežö‘ž‰e…‰yà¥$.ÉÎ0T”t^X¯|×h²@Á“„æ¹ÈUë¿ÔKÇÌAë•–0Ÿ„ïfØ$Ñ4è–ÖZÑóQ;y³•ø=A pDPl^a‘›T6µ¼ŽUK.$ý“g/[G”‡vËé¬ÀÁŠ&~#ˆß:ïuPÓ_ní²¢Ú ùO—¨BÌ7°ªäpU@<¡œ¹ýU4ä'9EúKvßÃÞ"ܬ‚㫾ÿ«ê—fÃèÙ†6È3+ =A¯•ÅØlúL~Û²FPK Íã…:­ä-£³çq‹~½ÞF…‡³–ÖF÷Œ4*ã+ÙýîÕ#ýËbÝgóŸV I‰§«­3ÉÕ¨·«U::Ø þ>ÏAáaø ši ÔmØû‰Žût@Àïé¥ìΪ·ë B¥Û2#ó2âK_JAí¾©–m ä­Ó|µ~pjT³Ç“Ù>dšàÄ>‚êW|lÍ0¢R úš¯Ä…-g<ÊÈzòVño£‹µeck3ößMÞW¸[ª —¥SìÒ†ýõ-¸uA¿L¹gµ-Ï#sl«/¯¢ØÛëÑX¯—Jο^ÕŒÀSŒ÷´¤UKâièù Ý€ÁÎOøúM À>MÉ«©Qþ¤zšPkůãY‰™ M„| µÇŠÍ¬ÜÆØÕgª=À"©®ŽäÒ ¥¥Ï¬ÈÅ€¶n‚úØízï¡m ËB8Ð’Mʼ1Û¹Lo#3w %Zyý:)L(·Åua©9œéë&Ú®-AÕ:€[Žú)h†$3*ä]ˆ­¢s†O2KlÏ9Nt£‚·stF˜¸cé(Òë´ìV䔡.áYg“L—ÍææÂ6¢š ÕÕó—Á·eti&­"±øÌÃÕÃ¢Í 7}.^|Qz|- ž³ iÀýÈ*¶rÛ°4ì×KõÆoÁKòÂ;¿+ën„ë”V«Ögk ABÍ*2ÝÍ(n¿$.År n½ ·mñgÀ@ÕìRª½)\HñT¢ÅÅ}$2­‡¢“†w*(üYŠç{Ë•¡â]b ›P:ËBl†U‹ÊvÒ”ZkB52Í©ý~3éD÷ž¥€Î¸°”Na¢‘Äw¤­¢óc­¶ ñjÃÀýEW”iœ·Ãòwy<ÀfúQ¸tÇzÕJð“R•ÊãÑ€Ý`®¸û0—íÊfÏZe¶EqÍ×gäž÷±­}_•{"ƒë&'¼YÔFÎ%%QÍì±u_»{ë`¨a»Ô"i F!÷[&K+h³ÓaÐÛ …R¹HÕNtÑÀn¹y‰)FºÂ0âÒ@ÓEÍÌ4,/¾!­çûÅËo¤Ö ê‡î–ŽìàÔk(7 uÔfªoÑnšq§c¤Êó|—$º °Îþ’ù…ü'mE¦X¨áaý'ŠîŽÿ¹šªÍa+]±×ª„áö,œõ`CpÔPÎ1 V [wiŸ§"~*vWƯ§ÄÅ%¹ÿ8j t:®’$0±i©b¾Ü>15s{%ý;B÷Ã\©¯ùÃ3“Àès#G…P×_ÐÂ\ýDF€ÓXHD…c]HB8ÊséËܼxTž{€Q7­î¨XX7UeB,7Ý©Êxq¹PÕ*ø8å0˜z‹¦·ra!¾büÛùÀ¿g26ÐÆ7«cœ9~¬¼LÅ‘k†Ó@'ås2^³JlL{#:¹´ŽáëwNIh%ì‚ö-T“‘~ªZ†V 5ÁÆçñ>,);„J“4Kèïb¼rÇ#º(p…á¾âö¶5KFöWa3NÆB„o("UAìêy sO®¿›wW­ÚùjÓ/µ ìk˜»t±iÆ æ–Üì÷éC˜·µâš2\'ó^ö”@mn½ý1 Y®°œ£!\ˆu;£'-;µœOËGaT~ƒ4¹½yPÉ‹o:x„k«Ñ£?©y–¥'­ØîG–QV#708[;Àº£tGÇègh“<—Ä`´ÖÐf SÑ»ÌÙdÕJ—Ï]e¥@¸Ñe>ñvƒ„¨èKµ”ÔYØŽ³?À²º\–à›UDŠS­®cßv‚yžV±´e‡ö…P§°ìaFõëÊiøEf` ØÄ\µª¹@îÓbcéç¶y¬Š*§›§þÙ¶Ê4çÙñ+'x£ OÙ¦4IyznXõ­Åõ^ª-]u#Ƭß5x’¢FgÒ#Wb¸~R4Ný ýè€m(CnÏí/Œ¿$Ê-`Ênȧ×åk?Ò!tÎû7‘$;ï„A‘º³ðüˆPL•ÇEGi–Q•$Ì«e$¥”Sƒd‘ªÎLýOÊ–ZÇ?Ý)¦KÑE}ëUbž*©76T‹•hŒ *=¨?¿$Ù‹—äK§¸‡œ $q4Rª©—‚Åÿ}G+*thçä;ªÅÈõå?Y¿Ð\Wùj+xA5OHúª•ƒâĤёð¸Ãì´õ?\ˆ] Œ¤ß½X¨8Z`f,Åxc×Rå´ïP2¾2ô3L¢ì#Fûå ÖïìöwWP¿~‹’hÀjm§ºHÍòIîêÇ"ì#SÏøtÂtØ­äÙ, ÜUi˜o“ gfÈ×ÓGJá˜z¼ÃEjgƒh]aÒ%gÉ ƒ`JV–›ëÁeã„þ9—Á²¶ZÒj¤ 2Sv=´ iS¦‚IZ‚5úz:›ƒ*’ä ³ÕÙï [¡A Ž×ÛWs;%Õl3ü™¾Çqxq~¹V3‡Ô³=ˆ|Ä>ª&~kÎVƒh-•+Ì© "«)õ· ¶† ‹þŸã¦ÎÞñG7XŸ´¸!Ë-J~Yß5Ü)…Q}üŠí— M‡QJ<À¡TÉñu‰âXÎ.[ ‰A«rèxwsç.vk)|g½°{ÍwàÑ{—P÷AŸ:9øEt´ ܱ[ÍéMç@{©Œb:‘ƒ…[ÉŽ>¦'g˜ã:º”>ðÆ™ÑPj|="‹"Ô‚2IžgG·§§Ÿr­§‰fš½2%7X9áh¨ÙÆ+Ú\O0ÛLS®’x}`ì$>S„yË/\½¢.¢vA„U> ×Ô˜ºº­ŠïWd»8Ò^™˜šr,m-ÜQÓ}¬5‘åÍ^¶-ïun¸.òH+“m;çKi­ ¬ô€ôr¥ùGÀ ƒ6Öè‚}„(Y:”>kÖCýhk1ºz¸Á‚WŠûn®\dÃd©hÍ—ÊÆ€lCE$Î ©6Là­Hç…£p)¿zÏaÕÙXóœÌî)V›;ÓAá‡Ù]òzŸ©Ûò:µ}ZGtF,¦º¥–¤0g+·½/Ï‘xo40ºöaÁñ¿2tuíQ7&ÍdÚ¿ ú‘u7wWWnk4ÿsà§Ëù%9F¦aÎתHý!:¥Nc¡‡ÁŒ¾À7G㘑V®Ý+8½€P€ûºDÙÈGø/^£tÛŒ5)^Ìpc^^_}'ù=~žj2f–''ú¤PÇ—;Ô¾Ã(*2¿+6yeÙ2—gQú•[;ð;Ÿ¶vµ6(x;gq7•Ы¾7›ÙØÈAQœç²ž¥PdoÀc€0(nТ¬‹ôívÆ…,àVFZåJqšKÝ Þów…iYPKéò׳‚F…¯ëYê×MpLd`Cù»]N¤KÏPˆŽ¯£ÑŸ)Ñ{÷Ðí»C œ.ßo M÷OR*ÓÇ7Ð|µâ:ü¢¶Ú--&Sã%±œ’¯ÇÔÝçµãÕ¸0ÆD_É­(žiBù|< AiXq= <¼W>묈q+¾CÞ†uFpÿ@}Ñ‹µy-ïÑš`¢Æ_L_fŠqiìÀ•(Ù²ê §LdѼ~C ¥~¹0§bïÛ46ïÃùÑ[êõƒ$x¶Ái]b>%{øHåÂ=jï¿»üøÁDò`Ð7A\rÍnåp씩`Utp­Hº«Õµ±7aÐPä+­›[ {9–3ìÄúCЇÒ(Þn2Æ|àÇÊ<òwǰ¸{]ÅàLZPñ —N‘}&‡Nƒ:Ô È“B¸·#?G8 m¢mØ/ãE3÷=#v#YOóû%dyzR ˜þVâ°¦ŠÅµ´æö}ZÆpÃÀÊ&!ÈqÏL‡÷Õv#o-‡¾—OQÀćÈí‡hëI,BE“ú3|¿TÅ å*tÁ ÊA’ô[.³(UE !_6 ‚R%n¬ö‡vó‰äöJ>=Öô«3á6â<#Àœ‰/” ÎzA@&>RÚß`côd¸Q[ J$‘•†™p5­ü%òêÌh¨ü0¼ü-7SwË%GˆÐeMÃbN…r7±²Þ×M—°o*’:lÑÕz€×u~Œj©Z/Ÿ–˶­ã¸b©l?ŒÒ—ŠjÜgœ[Ò~ÈFî2̪ }„Ê®z^:”¡µf€å6DX˜šr?ƒ­xÁ1 “ýx 3oÔØ†v ²õÐr¢ÆÔszJx—¸·Cu¾·1iïDzð{TÍiÑ™èĶóª®!6!SÕ"RiÒ]4ê¨Í¾/ü¸¢enðÁ%eWÇóI×xâÕlØø„†ÈèAE‚¤®|+¾RÇæí£èÅ$†Ù±â~±1ðUFÎ%ßÐÌÄõA¿9yé0š‡âeÈqåŠÐÚóœgÊC,–Qð½h¼*x‡ó½{ç/Bê\aq¬êá:ë;®4…šÓ)ÉBA4-×§U"ŒF#^5Øã½ ¡£ßfµr*”ä ¿ð7‡ÞWÎìS¯F€aÚ×xµ¥ºµæ>Á‡L_‘̱¸úÙ ®ÏsšV§ p+¥oÈ1ÖGÖ}*à2bL~>ªñÙÚ—¹|ëì» ‡?¤ˆèÄæŠÜº.Þ Ž<>¦Ð·}av*·ªÈ)²’› ÷6ªF¹hú=a|4k®'êÖ–ŸªW|}ÝVÏ'°U±)E'Ñer O7ùÇvƒ¨úT2 2Iä ´[¦òϯ£vÍ«PijA—RU +–«oÐU̯7z+zê±±Ãáë÷Ä .‚C-Ø“ÙÔ‘H‰µg a‡ÿ*¸ ×ÖÍ$Gç_Û6m°Ëƒ°Á[¡!àöÊiÓµ]QÁb âv5Otpp[×û„*:sZ R¹óêQõÑ\ÕýB}õo#®¹v¬TMºQâí¸ØæAI- Ö|˜/*™TÝÃO{ZK¤qYBµ/rÿjX§3vUr(^¥h$¢Ö#ªÖÊâîL³Å=¼¬¦¹ÛoÏÔÖz@£ÄaPÉÝþT”-°L&óõ˜.¿<¤¸ƒ76T‰0 úSåEüÐÌùÔ¹ãZYYÖË>f¤’:´ï&Xë/EÌo\þP¸TIðG?í‹Ämð «°è[BìUe±öe”+·<vª_¯$?¨[ÃO‹¶£ªÜƒDã[¼—µ-¼öççûo²ã nu†™Þmn×Ê}$3:¸ßTJU¯­€µWuö.å¼<°¬=²(7c󆩛wò©˜d‰Æ83°‰Þ—sà®Ð&´é5Ò)!¯1…@ÀçÍ!¯5¥¸´ª’GÖðšqž©æÉ[C}ÀßÍn]`‰Ä6èZå)õ¸zü8c¼„Rв~/Öµ³ãðçt½„ A–M߃“rþ¼peþÑáñàNry—°­“½¤E…ŽíŒ¤QQ5ÎÞ /Û†A5Ái· hJ¾í‡ñ¾µÆƒœÅ h¸)‰M +±|óuø¨öÕļ̄˜8Æh»^·\VÏâeå]q©F,3ý½<gÑÉOÁE_†7ó} JÓ»8iU.òýòI5²ƒ.h—ìbGˆ ª¡ÑÙm̸œ©nÒ¡HGÍß[f8vB1¨P¿bãlMªý‚xYÞ¨"Ý«ýaLöÀ È/yƒí>H Æ6ç).êlœZGoi&µù£ZÍC˜ö^=„Ç Éè.˜‡ŠfOù’ «“›-Ï¢eŸNæ3$˜¸}cÜé5w†7²Iäûá–»ÖyhœÈHr(­ÀF—[i|| ˆüMº§LY qÉF÷IJ;Îcèaã„öܽ°^üˆF/¥NHq²ø <ƒ 3cUŒÑiF©o#³k§|ƒYÀÛ"ý8R—_•S³ˆP—YºX¹áªb§|ªuÛ”üS»%d' ü³É;i&YQšþ˜.À§“ ¥’è߇\‰Cè18¢+T‹|dÍúgì5O“ ø(…¥›¼í¨Zp½¦W`H8yÀ¢V΄˜þö™×-]5@bÈ•$!ŸR*£}üÊøó˜ÂÛ@¦Š…!#0Îÿ¯‹sl®ƒa´hlœØjÛlœ4móĶybÛ¶íÆ¶m³±“û~}îŸØ³föšåÁPV¡B«>rÖÜóK+´4Šýhª¤u92´(y-˜w¬d–R²Ct®T쉪ÞwºÏ_ŸŠÓ"Žb-¡x?ÆNV …Æ*E­ £vºJ–G´Çø+Aë~ú-wàq’ö%o¤4¸ö’ðùËCZɦJ;«u`¢›»snñ;„&þîàPÛ.׸n‹Ç43…½ "1pÁÓµ´o„l…§D„äꈀÃÌswµs‚Ù9¨`ë;,©Òr¦Ó†þä8åwÑ4›Ò†:ˆÓPvʰDB[;vŒ¶‰Cmv÷%qéé:,ký{¸†L)Ðh¡T˜8Ô¬ldöi²m:úbÃy-@R‚‰Ë 4Ÿò_Âà™’Ø×ñü¸3/óñÆ/ƒÓ™-^¯T&Úû3µQ•¼w…Ö› ¼Ò±ì˜ÒÄäŸ'\üαZȬJA(~†9kz`»ÜÜ ÷@B¯\ª¹Õ¾—¤LäÂgÌOßOEP¯½FC‹_ ؈œýô”e‡èXÖfïUŽ-)sI¼ï)°ª–‰"ÆSâ¬ÿíÙH¥ñ†G‡8…™r•Ýåÿy8œç2—tž0ô9¬áö#’!Ù¤ÁበРფœÄ+fx{Ú-{C|©Ó!‡>a¥Â³ðû„þxkÙ » Ón¹ŒC½:#y‹‹Š×x—mY]üót—늋…, ^:ŠÈl_æ `uúƒ^í''·=µ’Ûõ’‡6±WéixnWŠ&Ý !.⨴ÁZåo±ã4BÌÝ‹ 0»&^Ùù}Â@Ä0öü…*4Øj ‹2å“XœÓ” !=™µŠMN>ÚˆÀã˜$s¾¡Î9ê5ìDµrË‘Øð>eçdœ!jxü} Q›Oª šÚqWõKc^+‡iÒ-º7LÕÖÓ8 ìB¼©'ÎõüŸ µÊ^ŒÒ ÂCžsJŃÀe”ǡ嫞<†èäRÈ‘æÐ(éÊÃ£Ç ÇuCÔ–ÝÆÎP&‹[éÈ¥Rú>ÑŸ±QS‡w®8oÏýà /fêM: jôñëÛs*=ÑŽYáHàç'â¨q‡©…{ýÌÂýmzÑ ›ÔgíÚš²èZÇôÖÍw]Ïz›®&òc/\6jl[@-vN=ä±±òä?Σk7U'ÏïØ]¦,sóÙð-\ŠýéRçqƒÕÏ~æ„àw3ž­ð0õPYë ›l|’>å¤Dp_Ÿ½_›+ã«‘)Æ®\Wü¹#Š‘J"Æky±N쇪$8<jHÝ‚1ß¾~©Ò%!OõBÉu(Õ·£nÕ|á_ÒÜý š¡ÔŽOIužàö]ÃLúyaR2õ~°"9Û”«®WõMõûÔ{è Î%|˜9=Jà•hã¦{e;Ó¾ùâ j]° #.Õvj–B¥’Ë9OGŒÃBÃú\Ö†5˜™ é¸sûÌMÐê›óÃÓ·¤6¿îòkvØ•5;lÛDÈõ õŠ%xùxò¼2̆*}°±Æà9'|û…¡¯a~ä° 4ðˆ‘Ûj*ëq˜ýÓ;Z1#*ë”Sw ÜT.gµQ„ìÓ‹ì$¯T‰¢Û÷õ<ùg¨»œùäô{Î*ëë 10MĨH§”g—ù™<NÍÇ‚HзçõbëhT§ " D¼3– `àJX"Ì1ÜÍFMNó^Ä\›ú^E•všÛ¾v¤’m^üõæ°y’úDa—1÷¡ä¹UèšFY’ƒÄFè¯A`U̇_9øÝ™4,tì§áL©ƒ¤¯y¡. ÚY½Æ…¼=¦Ä…t´ˆè\¢½o'Sè–Öï…N*þÂ);þ×áÍvÀnp3ÿóc=7vséêk’uÚž—¬{DR….×|ÕŒ•Œ±æy‹/êú߯ ±rXŽ8°ÖBQ´µõ…‚áùÝjY/áCÁósÍ¡1àJ—Ä“{L?"ßu˜8xÇëŠÎ×ø^Óy<¦ü«¢.¢kS9d,º}~ý}¸v»+.%œ/ªƒ:ÀýÌc;Ø’žd+÷{×ó»O„ߪñ,;_‹±/ð KùÝ„¶C?´L`Pfn™’¦À\µ!8ôªÏަdµ˜ R¬5„ÙffÉéŸÍ!2Ó'™“Î`=f°ágá§D/ɲ8ïy÷áÊ¢A‘eÆG6Fc«WÃÞ– 9ú²¹"$‹ òÅÞÅÏÄ÷¸ é͠˳ê/¢%ü^)oßX̪7þ·O0<â©Þ]sxƱˆ±KÄ«šÅ@Ü»öD_x,‡-ÃóÕiFd&s—Ô'-å¾µpÛ¯z|õ7Ù_R¨é_½ºÇÒÇFü}|­$=0xÅs A¢¸¦=íìPr-¦½ï”!?²V×ëuóÆJnP®àâ%]ìX"šÎ0.ßä&\¤¹d­o²6랺=Þr4QD«‚èoÙ Ä1‘‡‘K뢗zÝ øfÙrª8eØDf|Kþqäðàz“ÀÍí{¿?ê{°ªùŽõb4]’V˜K;óv‰ërE{éìQho TT¿àIâº×Ç`«äE÷`Ò'É…h›yf;έ•7%¦§ÍPSŸ~iQ*»-ÝGKíES]Ü•¬nRŽ7K(3‘.’{Ÿú¯½-m )U˜m€]H 3%¬W ´!Õ;Ç>r×à ¤ÇIâ?¥ghËv9'c õJ×4|ˆ³=£‘…×–öŽï…nd8)l³™‹«2}½q—:¿Êƃ\Êæ}â¹ü»“øô÷p›ßDˆnksÞ)±o<æ9sت•<Ô Œ®0z“Ÿ[yWC˜lê g™‚<Ù¡K€ß)‘Êq˜IäxÓõ í†Lrml÷H;Ÿ»ä´÷ƒEéHê{Êî1Ѩhû8›#_}&]òŠ™ „c‚ͪúÀØ.K«ëa²hí0*Öì´¸ìäëta;ÆÉ“ˆkàÑà±L{ù½û/-¯Œ¾Üà›MuêM‡PÀ™“|v ÅO¡"ËîËÎfó·£ó°£î®-»‰8H‰¥Žˆ²b“#?CÏ~Æ;*$6íM5ÖOJؼžõ+†HSóê¸M‚„”Çe6³©š„a¿e€R!ZîÃÖT^_‚SvòúÚŸ‘D5hJÇ»ÁO¤Ï8XEÅó'ÌÂ+‡GÃòB3lûjDºt²a¼K*qÅUs1ß[®ÌÛ‡;2ļ—€5$jÆ ¾Þ z$'½t¨ŸXÒÝI`ï.ˆÃ-ÿ §|c5’¶/Â?äÃJõ󘢖•y³-$^÷IݹÜ8­ w¹‹z%ae%TíóI”!Oï„gÜÅ ïâ7¿ö£¶q~Ý#Ú|î–Ddc$>>pj‘ødÍã§f“R@÷ÿ&0CaÑR?ÎŽ­FžîæÇ×¥'gã¢Ól\îâP¦Ë.£*SdfW~ô'—©ªA= 'ròÏÊQàp‹öUÇ=ƒÎœê¸jWw„×RE$/f—NUF[þ‘’5´°O_€þ®ªû`\Y<¼÷/šS›8ÁÜ^m×"Ÿ¼q"„ãPs8b›j‚ Ñ+œ#“ÝšÒÒqìW¼Mëûɦ¸ XŒM=!½×ùÛ2yw„F¯!¡Ê#V·çÐ_¸É Hób>¸”`Æà\ЕvžæßXr‰Ó‘úŒïó(€Œ·ˈiþ.ëòÔËM—Qè*ÒÃü0{PÝo…Âpòšü-”o}ëõÔ.§nð¡­¶jåùwAéXIH*{lÙ¶Y Ñ Ž|ŽR µCo6 i0°â†G —–ÏS@DI—.ùЉ—Ð×Ãc@o @Œ£ÎÀ½A´<þDÃn-O´n-h˜¢âJÚr*Š9ÔZ~€Ÿ>Ÿ®(æ-~za)oV-dÃïeÂΧ•µFô¹wË%ôw®®%!ß—2ü{ ^²ý*ãFÖÀØ2›”Á^ó›w¨]_׬tÞÅ쇠öÞ¸þɬ¬Ò͇ñ#–aP!íò‰;Nš¡tè>²‘ÜcÔMjÒÑPÍY„´c~POÝ©nrW9$/0.—¨µöR¿ a„äéb0¬¯æÛ{Šs4ƒßõÐl ×ÉW´·C¡2}#f|½¾a¡I¯º‰_ÃæS„5}h=áKm|¼ë0D®û½G%ƒ¦ª¹‰Yõ¨ŠYKh|ÚÃrû¨oúÛë1Vµ/dgk %u˜¬ïеÙ!ö3ò\ÿõ¡Eô‡›¨@ïñG›…I¹„’ŽÉºÌ,{2 ¯%!™½~¤åp¿ò~ÃËä7K^2îýPíñ†”¦¤Ùúc»]F6v@÷C ‰÷õkÅOå0&x õœ’ÿÁ[¦ÅËC %…jµô¥³—u5Í¥¦cØÛCÚgÅd:AO0»ëŠKˆãÁD$㯇ŒB…PàûÁгzáç©xiÙ¢_?=®ZÇ(Çh©-ÚY£$Ô0Ôâ/J¢+Ó _‰­‡‰S—3¯&†òŠáðiè]E=ú·kŽ~¡?ÇïÍÛAGˆ'%œ2è'†µ:¢~Æ"6 µ0¯ ²qU×› cL’õ÷¢ŒžŒÍúà»ë7š±¨ƒŸPm–ûûKik,¹|Ÿ>5’ ßK±4gìœ5Ÿˆý$åÖ$ãÔÈ&+ÿ¦êáNÓQ0¹OIqž IÅÖ1lÛÿ@„ÀÚWÅãT àªð†èν- b ™{g3#*_¢PÚOB”x~ÏÖ×xÌ£v^$]I&ëv[²ûÆòÓ}€òBíã7|ïÉnê…7u"à›QŸíÙ„í1ÿ’7‚Ó3HCD*IÔèHãÍùN7a+Ûsã’a0| ß¼dÏØÎïíGŠ¡fi´öDo§‰E„P:Aï½Ì«®«œ‘$»žÄ!ŠBx¾rv T}û–ÄG¾Ñ¦5·£€ÓÓBqÎéO`àùW¨šþì­»K”ËÄ >ìÏÇ?ÚÌ”Ü\’—}«ŸŸ“6Dl‚Çcdͽ±ÚmO#2ïqæü6»r‹þv$ ï#LhùÖ%œÖ»ÊEdÕ,Ìã{ÚÉkÞþ•².…%¡`pzfÔÙ¹…6R_S,LYQÔ"iža‰Hêaÿ_ÉCêQ¤ÛÕ'ISÚWÄ(k!ÿáY?{†·¤‡¡¨ž34p±€õŽ&ß¶ Gº\&lò‹§fÜùôDTj˜±‰Ìjg~XEùÙž •[³Ï®ÈxÆ·5æÒõÞ+qŒ>%[g«q7}ÛíâzLui>ÅÃ)MÙ[V…†äšÇâ=oôÔ}οWø&ƒÒ½9[nr0îlç…÷]x#…üðWæÚ™}·pbÛÿ£Ëè§°‘Êf–¥îd)GážçI³áé>ïÔ±Q³nt¶Ö´æ+~Ÿî_S%ÆZöW`hh"ÌࣆL‰Ué=R¤+̨Œ}/FV!Áp{£*Wî?šž/€5>HÅÎ&hE±‘6X¶5“SÒ‰Þ>5f˜;ÐJµ$HöÍ´lûÐÃýÔ1ëE%Ö%ÄÑã Ýâúþé½,u?÷û:>úøÝÖë¸t¯i,EG.Pð¨ÐÞ¥kZkK.\¾ç‚”ÜÿsqÈb‚ú ¸EµU /ü}AöynõÐtà æ]Ź·W±CBY Nöxó”àóã—ºRKV"˜²©û‡æ6E^pÍrl{„‘ l>m—Jí:s¦?³”aÑ˱y¸ÙæÁˆè\:57*g\Ú£‡¸lÍz´m¸ë°x™„ÌÛžŽîwÖ’2£Õw1w9<.´à‘¹mZt8h‹~:ßO+ä”ihÿàŽñå,‰!÷çžÄt è‘€—ªŸúv³{Yä³ûðÒañ¡aãŸaÖ­ÀŒô¥ŸgBËŽùx-ΤFjꑹ©ÉÑ€D徨FÌåñB+ aI*eQ\ñÆ©d¯z2Á. ~¬íWG7ãz‡´õN(ìk.÷†±ýÒîFÉ-…ꪕARæ…~…~¾ÓEô FXm3SøF’‡¨¾•P^qëPŒÑ€jkí%Ü©/;hûž—…®Wõa7íkãŒ|Æ8¢kž×op4]~3|÷5½¾â&púj’¤TEÌ/áO'gðÁ¨œz[ˆG‰F×V¨%Ž=s~f™øÅü‡†kÿp$©ù½|UqÖ!”üE„Ç÷·‚yÏ·®îõ,kÎ[5 ±˜ ##dØôËËqa·]‚‘'tú/EQó„iø™œŽŒZZ,\PuW–Ÿyéû9ç{ˆ]>Òú #iouÛ½±§ P(ížß`‚y) „Š!µ J[Ì6"#ƒõ½–>Á–×KQ+Í#D‰üª‰.3S‹uÍ B¾á kW” &S&›ü€"…ÅU"‰=0øðCæï:þøËâúʘyáj¦;®.f66*–"–¾–òCK² @­è÷Ç…ÿ¬tìEµwŒ¹cé8àdÞ⸨†¡»4qu²5I‘ùbGwçî*…üÓ”S¯Ð!P"ä 71ÿ|‹œw¢7Ê®L²V{ˆÍÏ |ÀX)’£çÝ:V™%Â\ðb©#5W69püþ«ù­`OìÛF´‰óÛKƾ³ #ØÉõOm-»y]D†ƒSâ2Ô»S°- Y™4›ÛëÓ&x ¡3ßâ˜ë¥ ÜÄ6Hލ«3øÊÿ‚0‰}Üo•®DŽn_} enm&§ê[ Î(®Ë ŽÙN;ö`[Ôã¡O9 ˜Ùcz“ÿM”gµæòaרk4-¸–ÊKôÚRJ,ú× K †Ž‚2ÙÁÅ+`¯«±ê»9óàñüi’S@ƒª†mv¹Wøýçድ†aG?ïèv_b"É<ÁvK¡ýþh.”ÏÚ” ['zûNwtÍâO5ûw^ä¯aëHëöÓp‰ÜÖwcšCméeÉfè-ý©Sl0^Ý –Œ|h"ã§ñø·`¿«©:¯Ô”u »¼&F\еµ?*n`I¨íèøÏªÌP]o[cŽ$.W»ìDʾòr_T†;Ö¸$™ï.V}=}¹Ÿ(ÀŠ™-&Zû|´>ʯ/‘Ðo¸öHAâ} b´ÑižWx/Ä~T:1§ç¿5Õ`*l“q4Æ:Ü]{Þt°Òz1ÿ½6˜hÆÚíZÞ ö¢×³qo¿ Kp,±ÙV6¬ PbJ¦c·šLî;]”XDfá,Ô õQC¸#—Êô¯hQd7©É²‘‹Ø+¢Zj( s=œƒ+7ñ­KñÂöuY©¤OsýíÐ7ݰî d‡8n©ŽC´£.¿Y@6âÊX›ˆCô©†U2¾§¬_»9(Î'°Lî}Ý–8ŽÓGš28$!d»7è¿CCôÚìÞe\F£:‘·KL²ÓSÇx£ÝZ¹ÛW|@7ê¼`P ïYé­ÉÃ9ÈúÔPm³ëÍ6}”‚wuÕM«E²î‹nó–‚±ò FºšHNÅ{É/u,¹Œ`Ä_áà–˜ýûÅë¸F<8ñ §ÃåÓ¾'·}ÿ”†Ö¢¸K±+¦Þl&S)©%Ie`øäüÊòMœJ¯ÁC¼kÛ4M¡‹,´g°AcJÝQ‹Ð¨ß|£±4úp¨â—ü¬lÑ™íè$„/£Iü©‚Å”ÒFn-ˆ½·±Ô^“IëF$U¦×ÀðÑgʾ2¡z-´nnè ôeDHe%Í›?E•ĵîEciyBŽÅšD?œ€P»QÍÔžŽv4ÚPs,T˜Óa «;Dü³©½0,×Üm—ˆEo!{[ý'º,]Fýù9˜”ÈNÎõ¿À2·m´È êçúþ¶òæé@ag;ð2ÄG“‹¿<ê'cŠ™vÄ¢|ºþÝ݆‘K­u³i>èþéÁã2`*z£­æ‘êqy˜¾`;d(_tDÛyfÏì‰Ï‘ïø [!{‰ïÓŒ&‰èˆœˆ4¬:/eÒã6ÕÂŽú–õi6‚ ;«×±½fÓeáŠsa6rä•ÐÕõ ýFñ·³z쎻ÃüÛ¨ŒèîÃ9ñäñwq bUŠšk&~"­‰¦ Ý1.‡4$¤ÂcÝYl™á‘§”3éÈÐQB,$àÆË4_*ùPeK±åR¥?ŠÒËÕ†¨Ë Ù¾¸)?ŸØT$±)½]F½?% GœX¼‰»¤P§·HOK4"3N)áe;}¿µË|ÿº¡£PÏJAm/@Ë!ÇþlÜ÷´Zü¹:/g°áy:fñ$ŸZŽ T"€Z€ž£B›¸ê8¡ë+Æâí‘ñË7öÍ|¾Any»/È; ÆžŒ{-~Ä}«³ýî/ 8šïr Þ ¥ó4æ³î%ŒûÅ }êÐ,øY[›ÚðA)—„ò‘Y~ãŠã+Ö…l7ÎA¬ZŠvŸ*¦ Ñ‹ÑñxeM*¥ ¢l)‘˜zpgFò}‰Cߎ‰qš&ðúñaÿÍù¦Óz°Ÿî¾GKŠ7ª»ávàjó¸ Ûøý¥ ÿÑBù[DžH…8ª†É]½$ gp†Ü»ºÖÅB4Ë\ãžeôeîÓ è ß4É1"rÛée±X•?<÷†¶W¿¯î†ÃÖànêŠ j ÿÆY^ J*ílHžÛU'Z0 œ F°Ð¥Sž­À½@P`ÏÖÌ/$±d4ÿøqA €ã@ÂÝakóñã_W"¶ÓÊÓ¢X×^÷*Fg׸år½ÁXð¾âþíž(²‚ÐÄ‚`IV†-׸,q~þÀ+¾;—DIÄë™’–ÓϦöªæ9?{/.¤+p:•uéÔ¦IFÊúé$Iÿž5w]kØPb’À^¸X`MérÕƒþÏÕ™ýÀ‘“6·³Ù,èÅUÔdÞ¹R…¤ebÏݼpkA7îwbcy389ÙÆ#M5ÙË&RYue½¼Â܈Ûó‰¾Y­0zé|…^ð‚Ë^}&²3~Æ:¬F9Är—4Çö]AËÍ-±DïQºÿÅO×fõÁq4ò^yƒÑƒÐ<šöóhêŽÞæ‡Ùg˜Ê˜gÕ…61¼jçïON$ãyòå8Ds„Å„·ãŠKq¬šõ èg¤¦Oq¸ñ,+Qår\äs¼µ*±ðvNþ@ÕI0{ É Dß}êÈ%rÖŸ¾³ä¼-g&©_ü5êqöW'ú»dÜsºC™Çàˆ =þÏ>¿Ã’hf’" U¬Mßú§€6¬š–Ðý«Ü©çÖt,ÚZõ¤QuŠX¬Tã#»3¬~Î`ËïýÕ±Ûá¿‚TÖèN&ÍÝ[·KÊ ¶£TÓõ(ÂQÙ«Âkg •˯¢Dð˜›q°Î[Rë+Ìõ-å% GFw`6nC–äÝbò2¶Qß̇£ÁÂ^4ˆj#|,¸ù¦ßÂdËδüš=¥ªÏ—ŒWN%m˜¿Úr\əҶ¥R™‡ÀÆŸ3lèÉ’¥*/¬>„Œœ ¸»ùs'­@a[´OŠàF‘·62Á”4a¿¯þ™šŸÛ^ü¬ZR…€´R>)_™ŠÃ-cCUݹíX àœmu…T”‘XTËì7}s¤°ûɽAÁÅP6¹¦bkÞ¼s°Þv"P¸q JóA% ºzn¤nžg· iaÀêPâ‡Æ>è ß…âë‹ÊÃßÔ[ &ŽŽlNßtJooP¥™TD¬ƒÐtB¢f¦ôÀ•là…LÍ(ɲW_¤sxq*Â*Œ˜j"Ri Âü1Åô‰ ÆRÈœ4²ú¿*žxÊðÆüÀ“È ‰2¦ÆšÅÔZê /Æp~ÙN¦Kr/áðj¸êâãåßWöþ¼W€ì×tÈTáÿgCl‡wލø ìúÁÖÎ+[IIÌÒWºý…³Y*zžÍ}C§ë@.ZØfÆgω†ðQ¶VàÕ&R€vîSÙ¸Ôˆ6«AÇÚåx=X¬G.uUýî"šNŒ¹ëÛVý™Ñë½q³˜ƒÄ©g’6UtÐ<\’MŒ˜ÇuX“²lBxÂZ°ž_ÊU=žúÐß"B¾Zܹ ËØSpR,ŸR‰b¦êÿ­çö ûµÑ©Cï$çE挸^RJ€v™TDQ®úž"—š ÕM…[ì Ýp­™òÇ‘½c.‚’õ¸¾ÿîâ~y*1*…5¸xŠòe̚˴TE!ä“¡RÈ.Qîó)P—˜zýÚ„—ˆ”F×>ç¥ôàX€A#r§|u?\¼hv©n[Ûœ@¬–s”öçe'»—™'=H•¨ë™Ê„ÆÞœÏ!Ühøç¾¦H^ QḠó¡È«IhÍKXxï°Å"â«Vb^Y8!d/‡ÍñÕïú¨ð¢ŸÍy!.ûÓSü5D÷£í(¹J/hµîwˆ>ËçNŒ?œ—Éwl‰³…“š›åË¡AV{RôO³>Ò¤Ãh¦žÉ]0âù !ìváQ$nuöþ¢a"¤u'ÒûQ?Ïv>˜ÿ#)},ó0¹;}^ŽÔ}ŒcÍ4™@¯£HA¶†cq.u„!ॕãå×°}šLöû°vTëF‡FXžÚÀ¬Oèë&ˆ‰‹bǪû zÁã$ŠŽá£ÅNgàÓêÕ^ã‚k§h§PghÁˆídÕÑÍæ¤÷«—¹ÒD­sGWft ^y/¼ ÍŸÎðYÆUý=ê]Î*NZ7VÅœÄT{ GägÁÙn.6äcÔ±¿: ´è®Me£ÝžÃº³ÈD˜†17EU¤»æÕô‹Çʃ=ú¯Ž<Þ ç]²eç·'vUò¹?<Š:“‚½ÞÖw¼´ÅXæ g) *l¥ûòƒŽ§v‘ljWß<½öð(Õ P&ƒ V‹_hÔÔGsâ`lWJ4·_Îz«ò8ÆñìJ8=aUonÝ«0瘥.ü 4Ñíy ‘-%î¸Fc• 5ÞÇǾy¢­ û_2#ÎÁšÒ,•´C‰Mê¸`é½Ì u?™ë`!œ‹â¦F&•>¥c…OöMVˆv‡¯½&M‚g ùÌq&ݯÏ=²YTÄLà U×-悦î|a§]e*ÉA÷ÒôQZR)¡—ʳ$j´N«»t‘ñF¦üýò¡]¨âé£S-kmA™Wž££GœŒZ'_Ào"GΖ:-OÆf»"ôöWÉ–²I˜Dù¢JËmËŒ9Lz_U¬)æã› úS*éH¥†e”"NŽø÷#I´¶ôe>*¼ãò™³³w}/€âÈk+ §à]¶P¦˜@zB$À=Æ™PîmÖîM¶!“ARð(qÃ3Ó$EºÅiæI:Ï8K1ÐuÙ«ïŽ!ÇïdIÙ³f£D‚Ò;âÈ „ß·rME•áSëç§P® WÀcõŠá!·†)>OÙbq`ë­Ë÷~øy>?Zq Ã=‘LgW<›¦7Á½dÐùõ“ëHu sWåõò›ì…d°ô¥é4Gªu§£}ŒAÝœo¤_h¸Íe<ýso6kf•²|£IR™_€R@3#·_ÒX©’¢&;àÌt¹’{ÇTCÊi 3:@Oå²n¬°é×x-ïÁ0aŒ/uÔ%¼LGmdKŽYÄ"Í®¤˜ ¼1ßîcF¨ñbõ×Iæ™G+LŠ+zástMÐ_Û3ÕÓˆŸ{|UËnãáû°‰¥&¶‚’±½ºC’¤Ø š©%ø°Á@§ß|­‚D§¼¬½ŠxôV[ÂGˆ©ú=OÔŽ3§.N¬(XœÈ™e‚¼ ÉøBL‰ƒ?A×Ó1t#+ïîâ7°F”iz²Ã=™ö‚ŸÛuÂÈ95 5)‚‚åCçF;®”æïJÕ×펷i!Õ+ì ä‹S%Dѯx•/;Èß'‰6µêg–KíÝ[F¥EŸ§5y/²M¥ÀÇÜC™C‘S )<[sÕ=2]„WO¢™eTøqàÆÂ é×· gsv¸\°¹^\Æ‹I›"•ÕÒ¿RCô“‰¨! Î—ׯ:iêݼÄ.D-‡šŸð”·„å›ožÀÇ,ˆ ™¥À€™MŸõH¿23ä7éuçφbIUºènüPfFÇÐ :6,Þ]\îøìh~-ïl;}^øD›Kc®ÅúªÊ¤œÐàGâT%ƒú]<Ì=—îK'[ƒEÖytz†ta “Ä´A$ï0Æõeæí7`+wÙBVýe ½Q¦ûú¡&þÎίҺ釂®àÜë%ëÄÆÕÐQ%«,UH\ôÏ5ç¡ÑŒÒA]†Þìba.Ñëõmë¶  ±˜$¼bl OµÚNU6"o%64’pµÀª‹[üèJ}dE0#‘$¾âV‹‹¬¯Íî9®ÞÛŒà«*ÏýÄoî”ð”ó/Öãí¡s‡^Ó*¹b©v3–ÖåN/DËAK—ÉW ÂëÈñ"ƒåÅírùû>” g¥H¤wÇÚçs)hAËæ‹ÈÍ™Ô>lÊ®–Ó/0w™¢d¿-éô$Ò³-‡ùIBÕ" öÓ8âôýL ;Uª.¾ð XtªOBó¦f`ft„‰>Þp¥,ôãï…äYYwÔ"Ôÿý@4÷_s/èn˜#n]Ÿ—›ùøûZžÒêèk[÷•ÎÝïs{áG=Rš¾Š·BT=¤î" Lc>p‘„äÒ›V+Q@–=LÉw;kèT;™ÃðˆcçïyÖHÀ3]úüŠ_°²V.¯ØÿØ›÷vr¼êÔóË?C5ïu@ºÈ“s±9kä/ºt úœ7"îç“)Lh©H÷LiMm™|á²GNu ¦&z¶¶CìN“K‰&;6-`5jƒ8èK V†ûì< u—$ÉM†4Tp˜®`?¥Æ&œI¢§–ª£JB‘T èPN¿q(øªŽ@WBñw Ä«®±¹Z$xRÈ“‰jnãÖ:rùÄ`ÚôNó i³¶­:(5â¾ïÆRùwáÐj@Æðd£šGåq8ΨT~Å®L8ÑØA¹¿~q›£S=<« c"ÖOqìú&cU‹ !!mð0òÁíÆSÁ%Ðz@¼šÂú­EÓƒE^Y¼ÛÔS-a™Ì€wÑÍ«r­°æïˆËE8ç‰ù£ñy}"·¯s²‡"z9 ÚI¤(Ž»ÁÒsÇÛÊUÊùG€°Ô c){üÓ“8Ê_Æâ[¾I¿×0šÃ’¿ë¬Î7ém`öZ”V’ðÏhõøå³ƒÿ¯ÇžçÒ*,âkÞº61ЫÅÔÙYƒBƒ~vN-vE½lDPkU"¿ëVY¾Z„¼£|Ž$D?L1I\èm6¤¨@ÀäW±e¢\éóoßíýfð~öj¤Bi'QïÙµ¼‚Ô&òQMÄmÂÁ4Q·´Wp5Á•\ò×K¦ýâc þÅ)–…Æ]›½3Ô_Mjj›“|KøÙ!‰Dãým¬ÃOHí> stream xÚlºcŒ®Í¶5ܶ¹ÚwÛ¶mÛ¶mw¯¶m»WÛæjÛ¶më{öÞïÙ''ùrý™ªÔ˜£FR•™‹”PÌÞÎEÅÓÁ”‘–‘Ž  ,¦¢ÂÈÀÀ` c†!%v25t±´·1t1娛š”MŒL&FR€°½ƒ§“¥¹… €Â˜òßA€š¡‰¥­¥@ÍÞÆÞÍÒØÀãææ&àæìJçäÊG÷Ï"eSS€‹…)ÀÌÒÆ ,¯ ))' —Sˆ›Ú™:Ú\l,2–ƦvΦ”3{'€Í€±½‰å¿09Óý€›©“Ë?ÀÌœìm²¢*‚bòr*Qaza€¡ @FâŸåv.Î\ÿT›»¸ü«;€Ë-ÃÿZFÿµþ›uòøEÃÈ0±4v™š[ÚÁÐÿ‹7I;3{ÛÂ&®ÿ“úó?øÿpH 015û§ÚÕÆFÎÐÖ@!loëàêbêµ71u²ü‹{w'Ë"ÿSjhkiãùÿ[üÿ*$] ÿ!CÐÎüúþ²t³ô05Q°tù‡o'WÓÿ„ÕMÿs6²¦&–®¶ÿYnú'ÿœª‰½çÿÛñŸVþ½½š’¤¨´õEðï´¨±½‰¥9@Ùå> LþøwZÁÐò? ú,ÿ£(ãÿú²†.N–mºI„á_ßÿXºÿ[%$dïáMËÄÀ efc02³³8˜9|ÿ\cW''S;—“þO/ÿãÿ[L¦¦¦Æ0kËöÆÜ¿­ÒZB+üD‹f+Á©g§ T©—W¦zn´‘-ÿZ˜è^aß«`ç»ÃáÍñî^îHÞ7Æ™ÂOLF†ë.c¿–WšûÕl½+¼Õ‡ë]ƒ©aÙËÝDܹd¬¯)PM²dåž×H9–ñ"‹3F”wôƒ#mǯ.<Ú‰Sê’£dj}ÙîSW#ÍZ„^ñ¿î­„åïÂÝbé[V:†iÔ_Y kk*Ì1vI`æi`a‰l…’m»U~ÅþÝ ¼¿bÞƒHßt\>Ôyʧž‡ˆ,¿á‘ßÜà—Å“¿å‚Ì^ü”þã·õÄËRÙéq¸;ãöâ7­®®Cîà2M®»-5/JÄ&{è=b»Ç•».½ä"ã¸!à=ι1¶ªŽB…Way<› ¿‰Aô'ª-2iþÚé¬ðÝ‹×f‡TH)ÂeÃDî‚­ÔlÃ$/ÐîNFø4zô´­M*®‚ùè‘€~pÔÙa2ýlú!ÞÚg9`£ÜäÉ~¬¬ —_gâü‰¢3ñVÅà’€^íÚÝYßq©â âKèÏJ-“íÓÅžzlµ¾ṏHVσ~´4*Ÿd?ó2°®Öß0$®<‡‹i*dê‚°W‚½Ñ†ƒPš–œz›¯¸Çî+ UæÉéóY9ònTYh÷žòŠ¿S©ŸqðPnâ1Øwþø îìÃþtïÅ x\ Œ¤á3Þ#M 3R¥nòt;ý*ÛJ8n™g’þЯwý+gÙK&ß¡°S¦åHvøýÚaØLJá`UÇï1h?sا05D@Š4d‰›¥¹ŒÅ4=QÙÐU`¾xñq•íêÊêj4¶]P ÇæôEÌLrÉT,À»ä«t5„q!ñ[oíR¨MÅ G§5™Ú¹º>û´’\»ë.³‹eÊ= ܯ›rp ‡FÛ½IÓ®ÚܹŸ¡,„Ë£ÂkPjóG€ÐºcøËãî¯* ¸ç°Ø$ôðEovZ+ŸL†¥_\[ÊÖj¿m§=û¢ý1´› þ~xQqŽñ&H.ýÞtÔ—VÕ°Á˜õúôX weЮª¿mI¾ˆöc% qªóÖ³-!ºÞ%Ë@ðéi–,ÿ4˜Àu{ßqDt߯ƪiG.Y¼'WÿÑ]n7·Jò\V”œC«Ø\s:v¿lĤWÒŠàlÞ†æC—Á]§¸I`Ìœsû-Á§ß)yÛ‡AeìëÞ8U!X£ŒóñÃ5ùûö0E½šh=’h¨(3oNnþ£ôG ".,MĸhZµ;ÈÙq® bm‚{“karõÉÁÉŽtÈ ôÑ!„Ë … Ÿ°FãC€Í¶`ë™<ºpÙÒ»ó1~€ó‚‡FÐgo“ö^Öæ[¡äd øê¨™¾[_Rϵ?:ÛBó-‘mµ­Ød$9 ¼z5µÚúÖñ/Þ\¥[Ûh9àõXÅ· (µÕ-þIìßÉQÉxÏáãΔªz‹róK›ºlFKi¶3„HêNy9ã†n½ˆ‡ƒ@“=q?æ¼ÐjÓPÇr³#Ö™¨Äâ͆…'fR{‰¦.¸9<¬7½–Þ_ „[1Ÿ«÷­#þr”Ô5ñ"uÊÞ“Ÿ˜–öW-[í¦'ÄžÒ•(¤|©m5#RÎM^qlt¥‚a¢ô„õ`,¼&„eÁ(ŠMu@ø3b ’Ý,™ýEòS ˜å¤}Ÿ€oO>8ƒgg¨H§ Ç“2Yñ{ë¨ÍpÔ¾”¶î{ËçàsùSÛ.£›?­5?ª¾@­›ìV¾’ƒ)VD¶ÍsQçàf²~ý‚„GˆñžéaÉyÉ‹ý„¨]Ÿ‰¶¹w;UÇ}yƒy %8Õöä, ÑE%Þ*úóõ¼ù~`„žqP¡âù¯iS­ŒG¶[âm©yp´±›÷çÏ×Hñ*éU˜­´4½¼ ×ùEñ.ÔM²T/ q؂Ö%‘§àÙרø\ÙgMe…±þëÊÛ>â ~{È ð¸ç›g²Y7S¬Í)ì;6³ng5ï2WDŒ‘sXº”Lx^J½äiUXÐÔÛÍhU͇.=?MÓWò{cÏ'iq‰§šø¡6÷þØ:âYqʇ_jE?ŽÛ˜£FÙŒú¾lÿæ—O ïäÒª”Ù°òo`*!æ’‰ùr*ïËÒVè/Ï8ŸÃyU~û1ÚtÃ$~4 ï¹Ü'¬U«,jÒ/µ±ƒY~ó†›cÖ@iãqÅê‹ø Ý£±!kfjê…Ž ¾¢ú*§8Çq_ÛZ…!æp™F’¤ËùyˆGUËëª3%¢†3?[0”6_Hƒ­R³RüåkæÎ÷O>^!Ò$kþ *®£¿FªŠn¿f#çnÞ¨‚«o޾ü;á §Â|C8í|tù9—d£†AÉF=¶òÙ:”:¦'*À:¥q/ Nâ>1u>.nÖÍÉ8Âò¤.^3DŽÅâR¶Ÿ­-¿­‚§‹)VwœuMb29žî W2Ú˜ßQ`Áh=j€£8c4‹óÈϵ˜¼·µErÃRm`!Œ…u)Ê)aVà dÞ$D@Øý>ñ)º7Lgs8¬ޝ§×Þ%¼¼k±·Ë}™ø¢DÇk$‘ØûsBÇE0¿hÉó·{þ ³žO;;suŽÇU€VqAš‡pW¼µ¾¿;Æj.Çœ[·ðÕ?ã(‹þ•û§‹Ú§Xnxá¶‚Zs=o§½(zgÌ`[åÚŠèíç@ þ“°ÇnuIñRJöZˆæo_'0¤Mžatû Ž·em"óžû`€ženêóSãB8d>i҃ͶcNdç<ž‹½n±]x¬ †š÷ŽáògÚög-¸k]HjÛ¿Ï>œ¶Õöûaèbü…˜q£½øzéø10fÁ£´ Y³E² jf’ðNŒ*ôIzsØJh€ *î>ë$õ–q˜öNž8Ï:ŸD7 Ê Ý¸ÿ/ãp_ ª¨¼¾CëÅñ§LìµmÛ´9wÐR)j¨ùÏj—rrâµ°ÓX  J ’g; ŽgkºZ—¾˜¯€˜¤!’ì_¢ˆ&Êèd¸ÀfŒ>¤ˆp *¢9ÑYF’ìŸ!Û·>à§ p¢Û>á¦8¤©ìÎ< )Šá  söÚEXa\¦O6ކȣSbIâÉÂ=¼Sù}uóAäaûkj4'܋ݔåfjàp¡©…´ kßm6¹êéo t†½ÎŽŠ,ZF<ê?¬x£ùèï`yâiËæt{¬¼òú‡iò6¥`®œž8Ž;œ• ×È•f¨ Ƕ"Ð#„°·“ „}ÜÙO%'UåUÎkiÃL> üLÀÉ¥ yÚÁy¹·Š—ÊU\/VŸ'µ¾»‰3Y~}¥˜/ʼöBî´K4 .‡~²¥ýèq, ›õŠ ,ÆëDZÃO[Ð=d00$iÖþ$Æ/ËàpÇn·v»Si˜eÕž…S5m¯ŽT8-š9ÛÌ£Á7IJ °èšµéÇ_ÛOUäô áKàW<ë^ Œi+n®±©'sžþ… µU?!kBñP D®„ËÙoRïTªÔ$Í»×ÔáþdØ[*ƒhGá½B½ÀØ{Kà€S?@ÚÈ31Ž·@V¿qzñ“õT …/>*‰~Á4³Ëϱœ²âˆ˜¥v¡©Àøxh–®0šIhî6ýKß#ºß§ÒgS™™Š,»÷ Ô}(„/:ŽÅâT8\YSoL““÷œOíÕ²°´7ŸÆPÊDÙ“%‰ðI†¯„Ÿ£áDgÇ̺®*ËEç°éŸ8§mb7}÷­ÖûaË,<þÞ™>¤B¥±rظ‹{o^ P8×PtHdz¡u’ šÕd|éä²ü—¯®+ïP^HÔI.n…AN€Ž”0Ö[—ìÅ MÓ›šWTâc*Hó(±›Qq†ÆÄÊñ%:„ü‡92eðc…Ÿö6|õŸDù¼Q9€+EÝÅ&k¹¼Q“f·\s,}\î–a(½ùó ñTæçÀ!<NÚ›G¦+‚|ü¨&:à’k.Þ±d+d“ Þ0+ïŠü¢ø`ÌS3P=›§£Ry2Ïé†$Véùàu®9â²ì yðý¨¯‡h…ðöLY…õÃJ¼Ár2Ñ礟ïÚëÁ€Ú1‚\ ’ù˂Ԅ® Ë<¤¬Q…¨õ^ÛÖçøÙ¹Ñb:{dñ ŠÆ)TTV‚^ t%;?Ÿ¸(sr§ STðŸ·t Ùq!€¹™ÌdpnùI9½hDÉÀ ö ‘Õ„^ßëæO¥`æ ‡×e5»Œ‘±ðÍÃÀ˜‚è7(fYTär@Êϳɪm.gMÞìÎpØv¸ÅÞ¦áÒ*yY´.opi<j|Þ M·¡Á켳帢öÌ¥±%D©2q—½Ñ;Ù€‰¦ÉÕT¤ûs‘ @ÕXS/ï›ÉU¼}ظ—ÐúÒkÕ% 䪪 ĤÂÒmƒJD 5ôŸbç xé3Q¿³¯´ôéÎûåà‚qˆ* ·‹Ô;¤"ó(k óêô•sé5 ñïÊgKstœÎ´--Ku£Ôëu ½‘/ˆvÜ%Ñ2×5JŸ¯]û`ù÷$y23aƒKÖ"îYË›Jk®ÓÍ)xTd·Ô™^­^Ö4 Ôä äs"ôdIµœAÆw7gŠp kG˜yg^ª©Â†(dÒT熰“?÷Å3nº±T†˜uÀáãë»è ^ÛBÆjŒ¬¸ñr BÜÎm¶üB1eޮɄPûn)Dö-CSQ„ÔÒÌ”®€†>¿vhT ªyåð çø-„ëµAO7‚±*uWÒçC¤ÛgdfÌчk±"äô]—ÿ²åˆKh™sq*`e}=ìK8®NΔ“žDÝM»t»ª—ÛNöð¹v?9Íß²ôÛ„åÁ)Ù‰'HÞP¬Cd©fÒr÷‹)%ùãþƵÐ*ÆÞ«x)MC‰ïkVz†å÷ü“VLç#Ë«‘›¦‡ËÄ¢Àq1!oÖQKžèV?e"a‡éiª z‰vÔýÏùU:ukÛU/öÀr‡o©’ŸÛ/w˱g÷ZöÆßû¼@6êîþÌ,§õ 4“*\}t%õdgÙþ8WlN2n ;ö›?[ŒÆû»®\f›§ "ËŠÑ¿W~qÄßHõËuWëð ûq¼·è¨„ÐÂX Âx}"ùÓ3ÎëiñÃSÓ90Ã?ÆPÝ4($—ßÀWaW»Ëwhoˆ4`"Þ‰?^§Á—²æƒæÜä-žT@œ;3†Žÿ6O‡úê®oÞØ‚&÷¨}9Û³ÓG‰]8£5fõRÖ^.àSÙ¦»•ãò7adˆ]ªµq  ípžã”MÒÖæ$£ù I >Ù ÖPµ ·˜ßä¸çæÆÚ¦'¶hq”»­h8߯_qÞïuÊP€ç†G¡1ôy[ÃxfHVm HžÛ­x¬Õs¨ç··)Âì/c%˜…AÐ^÷YLÒ ®P™îzÌòE"õ»èë4_žèz†$rd˜ÂN9è3Ëï&»ó~ŠUÓÉ+©pëãÁLBYüvNg-¤¸íW˜Y¢ä8lx†Bõ»à)(ºÇ‡(';ìAâ¼ÁÉkO4ŒÊS`$û¬6îfNÁ»¥7¾ñóº'úüie”LçjAqfc¿”èˆ O®w½Ôß‹£„ë fÁ—Üž©•Œ³8Ýá+¡°8íÏ%ÞF@Éb‰^bJ€ñ±Øí Šº”º‘M A•ÙçtßÞ×Aˆîò~õеá6µy·ù¥( аäÍ–t_á´ŸµTn-®‹ÇÙƒÏC‚JPG ‹!…ˆŸØ"8ô–r²Â»‹šø·p ÏáÉu D³GgLûŠ´þ!ãšåȹ.½¹išPvÇ(N}Œ¡`l1þ„‚Ù0W¶7Ù·á$dW‰)²¢ > ·"Ü([ì¦D_Þ Ií³w͵-‹(?C×bKL!`l†xl>ò?l¿8ðùè¦DT½ËÞßç½ä˜i9Ïr+eåœLí–ÿ¼Û§Ÿºl×ñú ßKÕ—Ú[â¿S{¸9Û*\+;fÉ3xYJ#±¤ 5^&³ ¼áyPâÛŽ—x—U"I“þb‘3ôtåá=ÈöWë& …úr#جy‹à+³ ÉЯ;ó–Úmg¨è;™î³Ìª§a¾c1Rì{‚ÌØ';ë˜÷ Ò‹ZN €+Ûš¸_]—–ŽÈwœˆìa™ çY#oÐÀÎ×áXC¬Ê"”O£î_SÄÁM™žî3.ÓCƒÏ4¦¸ß‡Â ˜‚Ó.o¶àO4¥þP¿€×´PÀT’^Lгå2Áˆ©\R¦ögÒšíÅí':´ *ƒ%U pÞZòÝ~$o…ZakäÄãX«j×BZŒçEr52áæÿ¶rW\ñö‚>;µÆ…k{i}ÀÐSíð |ÃL‰¦„X³ä\V=šÇ ¤¤õ‹§%G‘zu¼E"Z‚È@÷èN.CóàL;]·ÏG3ªA.â‹w<ÙÎϦ&"‘_‹;‡«CÃü-Œ°3F>’p-Óçêí„§”Ïo–Ù=™í‰ Å™£ä‹ª§46ceáBÝû$S>Ru“IBY ™©ã·ªZÞÙ-N¡'Nk|© žÎ™"¦²x¿ã¹r\àα`0ëo9?PÇU>Mö¹/˜Kô;Ðh~o±ØO»©9ˆÛ98·È’)4;J}u#8Ü{€ƒ(KàÐðoHž ôÔÐòõÕŽ„nßÉPÔ ï^ê¸}];¬‚µˆeã]°ªy%ø»*½)\n¿7¾Xö”–2f·{_°xG”9¢ñ®øëUw¡5^¯2ʘ`O®¨^¡°÷IÐÛ2öŸBó»"“W– sy%’œâë¼¶þ¬ñš-Ã;’‰št¦K¸6²–ýc<æñÔÆ¹ÅGiÀg?û¹|ÒI½Îý²ÐA})Wá¤X¨Ë¾§‚¯iÐö%_˜P·šNý÷v:¿¯˜…6GêÞCý )y _¯òê|梼cÙˆŠ/ÎC÷&^)Þe-¾ˆë^oM½’4uÏËéD_%«f†Ùx!`=ÓÊ çoOõI¦ì1Xµ§$¥yyYÕdzQ:_מÚê¼ ŠÉQCË€÷õ6+ÄÐúªÈäué|RÃ@¼þœ>{™»Ûî;ª€é¹‚M~»Ö¼ÎWóÝV:4§î¤ V“lm·Qi™gæòk;ÀTž7)Ù¢à kÚ£'uR1J~&g§ó;ú–’³p繯xMôŸ~€öÀÛœ—»pXÈ_Ñ:2²ëG|éÇ/ŒøœËK¼)å9¸-kÆ»6yÌíÍiUåâ'ŽtÊ1Pqˆ—ˆ‡G§³ ;fuƒÊŸ=&D¶•W3––¤¦þî0ÚZP eò̘£´T¾ê KÖ©,/±ª§Ýçq“\]QO•Np,™\ň ºqh¡†U÷mX±’Añ‰·HDæî¯ÖT¿«)ê›ÂM½ÛŠÜë@ƒÐõ„¶ô†ñÇs0¤ ’ƒéWbý€¨÷œjS³!µùx³ˆTq'¼¾œˆ+Ä×2!øN(rÕˆtOçë _ñ͘˜Äˆ#zA™óasôXù%é÷cqµDE/ >E¤kOÐÃï „îÐðìÒ„ž¹+ÊÔqÈÚÉ?3œòg.hоès.õ’"L‡‹”®…3¤Š{ûg9 Å¿ÂyÖšâ×AˆŸ.«4ž¢mÿؾêm1é,i9Û2º9G`¼©ûì–gÑIxŒ‚Žé<¹ÝÆ? ûáÙväà Å*† ¨”f—’U•ø[[C…F}?ñâ6ëëH9*ëû‰6FyûËÓ6^Á΂Ÿ‘ŒHε.&2µ5ª4cïç} ¾›Þø'üåŸ?Z’â1? èûrØ â4{4Õe¯(&Æ8Q’0Òã[z ê(8—ÅehBwW¥‘z¤é)ÄwˆÒCž¾îáëÿT ¤e £#áõ§¸J5wÖÊ4¡X¼9éGròD•›ÕPÆ]‰)/ðõœª+´/ ²‰¤é€KHÛHËzFî°×'ßò+ŠÛB˜é u7"»jÚ§¸GþßImeŸLöًܛ䀳ŠÌˆ#*5$I¯œ,rQñ¨Ó•ív…”¦ú67¼hZ(÷†=Æ¥e‚46¡›@ߟ£ÒëgSs¥„,†áDÓ¶xÒTFæç€Ü΋wÇÖ$Kñ wƒ¸«ÏUü·ÂÌàç›Ã¼µ°  ï(U?Ä7bjМ6,IÒ9[î¬isT1.l¿7/y)ê2÷Ï ¦2naÌêxëg2±ƒšr?ɶ[^sÅ+‚A à„˜4Q?˜^ïR¯Y‘al]ü~ÿµ Ý™x òž¬|JGÞÉ3Üë ´9—¢—Œ~ Y&#"2·KV ©.Öñvý³Wµ*ÃJùåõ¾âu›»«%!°yˆ™6èǯ)Ö\ñ,h¸©MSªµ'o7IR&®i©òPh¹÷›ÔÆ^Úò—ëâUòýT¥Ã‘'tR>5ßoºª¡(v)ºîž=¶LÌ“öuâY£ŒSÅcFz9ß…·7˜#«Ž¦ÏK~‡–¥T>@¬5†E޵£-“˜ˆ’)ÌØäeÞïâq̇áøarª'Éî1Ò‡MŸ] vtê ‰½Kqþ6RŒÍ™ú"Bó+Õ%Mw ÂD5R¥a²u¸áÍö$ Ѷ¨¼Fž.ÐÂóñqjF£†Ãàå›­5ü0­y`T¡X3¦ž÷ÎEJùÔv2ØÁ ÁÛÌdùà7‰Ëñ´Bf¿ÅêÃí\dµîj*jàw.¹\XñõV,Å#Š€ ª‰—£'sÐßb9üöØ‹‹Ù›…Ù·2à Î)òž.]ƒç‘W¡œÍ+¥xmœ;T*.Ûvwrôù†#4ü¶CŠÉ¯29ªt&ÿX)!ÇTNÏRj=–×QAt7Q‰GäXâkº&—ÑØ•IP¤`ÀÒ$æKÐà1fÜBfÔW—йj6¨­¹×¼ªxxdA]À·Oÿ/Yd0ÂÜ„¨ÆÔqJ]ªiM‹ÃÜ„Xr†! qÐZû;ø©…œFFçŸ`ò•ïØž‚ŸùCPêøº'êƒboÿhƒÓ>€L°ò?Wtj5ù[‡B“RšÀҹLJjŸ˺¿¡¸CÊ{Yª þ‡“v¿1&»–M:Ìó} ÑåĔȀŠÕÜ’@îáTH¨‡b¦€ëœ]>Žé'£ÈyGYÐm8€ú¨£ŸòÞ‰a`ØÎzB,C°¿¾ðìv@)0.Äþ+@ƒöãÁö°÷ú&+nQ(T§éH8{Ì¢}·(cëä#û±õYü-A¾PZ9°…q”DÛÍ/¢™ÀáJm/B¾Ù¥®þXÒCŽØò‰æª†õÕù¸“¬]«CNî>dù yYóƒN3–Qˆ·àœ×ë³taiag q|ü\ÔOöÅ¢º€Q¯£›H‹QYT\Âæt_l×Å^¡³Àöµh(ª~:6¾ÇÕ£j&*÷ó¹°±vÁ›Èè—¿.:líŒaF­*HÿŠ'´wh¿tSÖá†EÐþùQ„ zÓ"$ˆ œ'5ü¯)Bwn¡íÆ¿¥}I˜]2yÆI±áãìÒ÷TÌaƒ¦"÷G¥ÜºXa6Az$whýŸ1à&®†ýK#[%7µ&ºàiutºíX »òX2y4@i[^¬4Í=Hƒ‘²àÖ¾sÐS9®ÊÃ\³ä˜wF:ƒ¯'´OxÇžº?Ç™jJ:«0^¥G¦.{Ê´UOÔ,ËŸß¹ ãó9mg×–*LøÓ.ÇŒÜç“#+Qœé_}—Ÿ ¿3vñHÏ ô~«ËôU!S˜Éáý8K‰3,:µz—¸ýnœ"~òÈ|ž°çhÒEH©?­<…M$]ÁÉÊ9Ãײjo>G²ã&Ð^Üv9TÐr›Ì}½oV“––f7+×I©dPVøìo<¨3ïÍöf4”“0OnöÛ² %B`Díóé™"Ò+ÛBfšhêbQqçYMΖè´Û´'¥éöLoœ‘èœe ý·À“n¼¤#Ñ] 2T0H×܃ó¤§NÝ-Q¬Åw.tÆæ)ZüመÈSC¶’üaw -Ý_:¢#Ýá¿6½¥Ù¥Á7Œ÷ÅGÃ…—n@wg6rÚ<¤Nâá’Ñ_2[Ãõrì3”ÍÑ2Dþpá[°¤¥Ó²=Žn§ZOõh|ÊÛò(¿þÅš V°ðB5¿èžþõvH¥oÁûUÎJ– R~âá€]°ôö.îQ‹:Ú©M±Fxd 7|A £•~(cÚ=Re…:/Ä©”Ý>5ÂØÔZ®‘!žþ\5ˆ¬~hu8 V/ÉkÝ• Ž"LóÅzQI1pµTæ$¥‚å®8”^2_mlm2q€y:•ÐM!«(µ…C!j-_÷ÎX ÁÊi$d\˜7¥á‰™ׇWáÍ*ðæ×À@}þf"ÆßÍCÉùí¹,îd).³S=Iº¾Jݵ#Aï¸i–ûIrOBÌÖ!'²n™`ðk1ªº9Tmÿg­LĬËcCß ]@`ëҬ׺œ!CçY}rÇ~{W8·BÅÍFíõ­Ì­É¸«.`,©WÚ›¤rfùnOC¸-FR\´¿ ³õŒS,7‹Ïf(LS²°hUÄuks÷‘ƒÐÛ즅íº5ê‚Z<é‡x 8H—#ž`»q¸Ñº#2Ĩ£3(¬:òϾøÐü\Th 4pß]ËO_ÝÎà£eè’mµ¬F¯¡)èvÝ#«F+r*^éöo¢àõoÔ‰ëúžÝ‚0ìÆlòc;ˆéüÖït;d 35<ùÕ™•‚IáΓ4PþJ½ñТž^ÞUðn1eê÷ÍÖƒã;ÞECŸŒ,Áç`ô\ú,@ã¡ßrqF[°Ft_]k8§‘òÔDæ–ØÊ»QT¨‚_®£3훓 !ˆ;¶vk" 4²¹^CåÛžÀ½EùüòkÓŸ­Nû+ 3RÊe³^òXKFV®7.U‹¥•ßžãÇíÞìT5­óXöd1&WÔªuTͼ"iI>‰(H˜Ä$·ÔQIvV¤àòœK¤HÚÐÁýbälqŠ'2ð½ÐªfìMmE¶#¸œ cùô­:aÞÈp}Ò-Úþp;Öì5"_×´@ñ.Xƒiuuí_§à`¡ù/«Fû4Ž•ÖŽEó ¦/ È!É9Ü!éêÓ ‰Û.xg½°{ÍšqàÑ~]pKWÕ6œŸÀ“`Xe˜]ïÈÒKŽÅcKÐ©ßŒî‹ ‰»|`v]'§ôŠ€náîXɰù`›ÛÓ'Uf¶6§áëœbnæ8ª»W¥-+’q;ýLÖæ˜ ike‘euäþKcšµE¼åóZQަ‘Þ9ðŸGfO¸Íd/…ÕÂ_+ýeÐã&±õ<â ”½yr5fP;pÕÖ¿Â.dpÖ· >9¢LÊÖƒ 8ƒê¡Ù«ÑÒÌX|¡ËO¸ó.Ìx(óå?úÖi™¶1T’2mp½½›WX‡ÀÄ6Ãp”Ø—pãÔΛIÒq…ù¿#…’m`’»™Ûnø¾R!'Ç^Ü †wgÝŦ½Z‹L¢…p—GUPw4ŒÆ—³ÚQ‚7nwfCÿ´”*C¬Éв7<ƒgñüw¶IŠêr‹KPÕ#ªËÀÓ¡ÓNc:·_k?ÞjÐØ-¦1“ì<» ú˜ˆÙ=ŽXIU²š™ßâ4…GŸeÒ,Føû®mÜF‹XÚ³ª¢uRJØõ¼­6èÍŠÖî!,PÒ`”Gª`³ã+ü‹Å¬Çb²uk½W£y¤ó#³ Á¿CöŸèdˆ²¬›:W±Úo/Ë•‡¹à,,r˜þB’µ'\Œ®ÆÞAIÉku†Nü^-á"oê,„û¥ýûñ*Ôf ¸k/‚XYRZt6ÝÌ&¿û.Ð~P»¸ùnßÊx÷öÞˆ}fÉþQAý©A:AÇé Äs$âôZSKºœ¸Ü=4Á¿k¿@…$´­yp ±è®É”,'íK$p»ðÇ-Þm˜kÌF§wôœRžVË¿“ù²ÏÂŒ”î ”ˆÒ›*¼ùS†4a}»cN¥§‘u"Æ)ž|¬˜n ôN÷(}ët™Œ ÄÔéêM˜™ü×p¿¸-e=<@%ÏDfâ2§ÛÔƒÍäÛx†bã˜*D謶ª\‚ær|Å7!-7 çįVB†hóæírpð‘DJƒƒ¥k–¥€Ħ(OÂLnp:Lp±äÓI7p*x^zõÜ™^ê 2ýŽwÓ­_tÛ²1;Ñ9–ódö&ñÖü^õ¯Èà¡hò*‡€é-+f~êÄ}Ó!©ðªš› ¿è컢¼~âk¦ª™8Ϧj&ÅV(ëÒ ÷:}¥S¾r¸Äðfá¤üÜÒ¸g¦&³Ex+´àSR²*<]q2è$XqÞ×½Ô××1ÚªJÖºU¦J§/â{žk‡Ö¦Åf¹WÆ xÌW8äWÏv§jÓtVR©è<PŠÞu˜Éã©*ºmŠ3<í‹òð‰°°íK4JW°šŒ†ÆWbºZטKÇ—•†&\mèã^$Œ‰nd¨ ¤o‹Á—áEuû¼Ú¸JE㌭½!{:ÜÈw0B/m‡ÃÜHß"¤Îc¦©„Òæ’Q­|öLÄH³Ÿˆ5äÙ®Ô¡{X<Ø^‚ÉEÒ½àOõ;¼Ý5û×Çø¶Ù]ohë&üàìÙÑg˜cçô˜c·3]©°qÙã™\ðš°@=fŸ(¤¡ÝõƒW±I¬½y€£Ž:¥úAòÍ•"»Ša¤ã—0p*ûƒÖýNÌzr¢ N·*:Ĩ¡dÃâ,bõ ËŽ!ï4t›,S®ßA¬I¦Î†GűŸ­ØKe¿ÓAWxAV5ŒÅb0uENpÅ(*YŠÉËÒ*&F®]àæØó8 k"ÜUfèÈ|E’jÌu&_*ŠYàÍë¯#Q{›x_£\•6cÌÐpì/S皣·qÈ {“AÞ-ýd”Òi…÷$#èÓ'"”hÚ§Ï’óÉš8 Y" ÄÏåÕ#ÜúÑ Ž†©êPéÓJ‰N ¯8ÏnÑɺ¼ü»â#æ ÎEJ{Wää%Qj ÃŽYg¢!IêÆ2Ñ"¼Ý<>²5éû×bîl“4a-–¦§Hç`Œ9ßEXë§•¶s¾äðµyÁ\M˜¾.¹0õðJ¦„çðˆÜXîf"*üÅj¹kQ=PJ¿’Ñ!òøVsâ<×:òq~¿ã]ƒàFãŸ5ÆEêLZ «+¡¾œPýS<ŠÁàøûRåP¬`ªc”Qö²Fåµ#Ð0_¶Q`PTÖÊÎiÉ$÷Â6>Û2\æ è÷¾Ñßú÷È-VÚЇ§YíŠ 2ý6é±X{: ‚Ô\gãß\E•B @qqÔ¼5QblÆoq–.Ç罓ïÇøÉ cj0¯¾æY Vq wVƒ7eîS©áÝ{/óŒ^0òWgÒñN‚—Ää™,‡,Ñ•-Ÿ2Ç~@­³ÙQ ÿnЧñ‘dÕH10WöÄé«c[º‡(p»M&©„EêŒMεÊÇèøÇƒI’ÌLéßèt²ã<ö¦µxÇÊfTk=lw’@GN›”W±þ¼c3‰\n´¥"3\j:ÔvõÓöÐ|ÉB;¡Aybçkÿf1¾« *2é CÔôúSe´a±˜B0­ø`ÏD¬à^WYO¼¥ɧý ,¢‰}f/‘ÕIA°UÍ?L4Bu™¤Âhh; $Ä0ï+©>w'ö­6â‘7~2¹ÀÎþ’2Þg ËÁècáÛhl·‰UÚ¸¢±¢¼øÿÄÅüºHµâiŒiÕ½ÚN£à}UÐSÝTíHñi\ÓVÊű;IØê„¾t0´ÈIŽké6*t8¬ï)7QmF |vR·Yó¦öä<'!•imŸ@jW ä ÀØcÑŠ}—h;Ð¥ß2o–÷UX=€ë¯á!Á‡ôÞä-á§Ë¢)[®sphÇt Ñ!¾ãÔPªœ8m§XMÃU¤´öè«IboGó¶»òhD†1ÖŠ‘g‘uØ2¹÷!÷.M—±òÕ Ç©7cKþ•— 왥sé¸Z«‰h0ÑÍMàn&"~Q¨(ƒŽà<Æ^däŠÅj Gh8š—t@©ðþ~?N´ÿçAvïw–í‚͇XiKî е hã›ÙþÇ'¥)!ÍIrúwȦð‚›Oºí (Ÿ¤çùå@6¡Ý¥ ³ˆ~ºí ·§Wã×ôW§©éo¤×_œx/7íÚ«FŸ‘c]#fsræ|áK˜¯ÆUtÔl; !Áô;jÓ°ŠýålüV WGÀ%ôÅ?“r‹â`<‡r¦ï*jXH\OEË¥ÜRÛ$ƒ7ã$×ñW~Èx¸yQÛ¥5}Mv3HsÂòËW$Uü{e«âÑ<£Á¿Çˆ±•çÑüePa5ÎqõÐOuâÖØQ‰la”‰a7¤äé"F3ï–}VñÄuˆtqûÁÛfÃÜÞŠPL8JÈÚ!U mM¿4v_Ä” î@ôŠèHô›°1¸fèÉ=MÔ bÓÅÄÖ­“n¸•Ÿ¦•Ž‘cÆÇ}^(²‹@…AøÈxCà!¨! é¬Å¡Ïäh‚ïaS©µ_w|Ï¥Z½Ê/hõûÝiK,QÚÕènëØ­Ø/„ ü Dz vĉ§";`6Ÿqeå8*ðÁràkâ3«ãF4r—Q«h×­àð`t¤`æ,øf\%±5`#ö²AnÓƒ¥F^i¡{Cm™½eêÄMÉOÚbe¢H*/±¯ÆÂ^8æœE†Coà:'¯Û¨Æ2…óyj¢¢óå+w†r'˜©®š,ít»àóß~]sÎ,q"}…D™èhùÔ$\yCXɬ‹:›I±5KƽäããAUƒ¨±¼÷Ó¨hÔ¬ê¯PN †ŽLÙp­`£iÕçÍžS¶mÿ.¸è §q[¥_5Ð:Ö¯HSõ fÚ;¸YíS&©•!GÄï©Ó9ƒ­0VøçŠ-ãjT’4V,%ž¶ìzJÜ{%cð=ù{¥3†­ëÐ:ý à iå’*c7QŽ?ÈÖ<—®Ð]p“â›eV#Q{Ãÿti'¨X›„(ѹ«Jrà ÜJ!D’/)rJ®*ûl•?ÇÛˤÍaÈ8¾ƒž…x¢ÍFrk?ÒTÇ)ݽI0ŽŽÖxŒ»V3mJK–J™çÝå7} FðŠV×½,Ò©¹RJb{j]¬e³Õjl»ÒÔ÷5ì¡ÃÑäE?”R g;Ä>ïxHœ2»ƒ ÍtYGnÛ“èûúý¸ü4¢yt}“\8q¸¥²êƒù RLÛ ó<…”ù™óÚ:2Ý#½u©`$ýjdL†Ëã×!eÆ,ó©“z0h4…7wƒ¼p&±Rײ¸-œvê"ü RJJhÈ9:Ò»Jóg€¦CÓ °(骔º‚ö¥rŸÃý8ÞŒrê„-ý©PK¼Sš øwEøshõÜ|9â[©*ùRL&½.ë×ÛÂ2d’ Üzeßg–Þ©&=U­2Ê‘†Þh¬râÜžÙ@¯™ óÔáç©_‰¼®.bì*êÓfÍïŠNxÊ<:ßðÞhÿŠ»/“›è8ß¡ÐÚ¸:7nœt0óCžç»c‰ŠÌÓ†´nyÁZ7äù# D¸ˆÚ3gþrÁ© 8e*útŠ$«©" æQ*ÛrÅb: œ6Ç‚òéECkÐ7™¾åáô!I¥.†œ¬®ç>~!C<¢¸šñÏøå4‘³TxÑUÀâ:eµ%‡¦%®â_,ÉPèH·Õ‡ÑD:Q¢í1ó©à6RTêql4Gn¥ãÊà§èX%u­_Hò±Ì7Mú¹af ïSáÎ×sçc.ýìi~+8èÝ9—¼ºÆ b|ÎûŸC÷C-÷9#Aæà1äŒÐu"ÐÂëGì ¡À…¹ñ+¬ö7‰ |¯£è=¶ñÿ>Ö~2Šh—¤ñN&Cfé$Ö¨ØotóØäbêÒí´EL ‹#a¦ŽÛ>L#K¨/Q½‰ŸÈ²ˆ¾PZ`kòÅâlK³Ù”n"e›ÌqÙOºŒò"Šw)4ì™no$£Uƒ¶‘ÿx <"*Y&ðŸ2¶ÝÎúï{*¼oÏþßfwín]ý QTaphúC¼E_ªª¸cv~ûÚ$ñ°Ä£ùl¨çé&M¦2ÔJ¡“ÂÝô=CüÌëòĸŒ¡l÷Œ(!O ™d°O\ú€ù“ _n`_éštQKÀ_ʈ«‚f0ÁÉ ÜÁÿ»( OÕ 7·ÆïÊ¡ö¡Z*”ßþ¨÷¿Ù°gPÍŸÔBó2oþ×ÐtÃjÛý{+íèä¾Ý#;"š 9Lâ΀ÌyùÅèWnª-NÝÖÃ`6‰ž{ðÕ"(«"¸(ªöÉFüx¬ìt*ô!'>÷œ<?³+zŠ­=7¯XþëM 5/ ß+ì+‡X­’-eRBž3Š\…©?:ƒ\˜¨[ÎÀeyX+Ý{" Pq›œÈÐøÒ ± ò-džV¼®šîÁ ¾SØ?±¡Ûrrâltä'Þï%ùí¿óI>5í~å¥.Ó[•å-쾕{1U­“3‚K ,秤ᚌ>/§ZÆ'$ïUظ¥Ž&›zöØhtúÜ7EßPux²ÿÜ$³‡5ÇBÌÛî/P¡¼I§\øS=ÿêZƒQ‰²ø ¨Ý<¾Ëèhv0ñÙÕˆšR½wÜš%D2îŠ|’)UT赊ª˜f³ïÁÍ|õ!zÍ ¤JËi}\,Gqp“ñ):-ŽøÜ Wo¹nóé%ï݇],ž,â¢C¿'fˆç.ò±Ä}©aVgkúI»éÃáÀb ÛÖÅÇ“þ-E¥«½ æ€z òû~cÊžïV‰vBŠy±Æõèü¨Þ˜øŽ*Qßkæ´ÎeL`i´o8ˆ¿¤6:RZÞ¦+]«ƒ={ÿ-»N¾nIÓ– §äg-t³xÇH)nÅP€ÔÃá&,´;Ý[@†}Ì*ŠP·=tRO~£þ’…Ä¢ÝRS¶=qÁZA œÇÒ„¥W+lŽ•!uDXZRf~WÃw±Z”•âÚIȇ¤RQ¸/Ìâ’(ü(ŠñCøê…@¨¥!T4§HJApÈú[Û{;ܩ庉ø_z´–u J§žCQ< Шq(º4j[—k¹ËÞO3¥¼X¾ÓU¾Ú¥›&ЛcxÔÁÒ籄G‹0Fà|@àÄYÚ*ù³I¿>ÙøB@Ó!ÔìÿSÛÂö˜êT[ #ݣŧ»É|8’‚/>0aò²ÉËí«NӪܦ¯¸Þµègö¥Tô  Èkn8½9'Åð·_œÒ–¼²}7*Ç ¤ñÕˆÿÑí£bKÓ‡Æë’+;ÏΕ_Mã@:ŠþŒQ•‹!©{?îK°{7Â4µæ:èm^é¥']†LXp7çy\nјtìÎßv› \Dn%’ñnnæ,¼+‹Ã‚¨›ŒŠ˜W§¢‰ ¤à¬4c¸Š8 ªiê¦{¶ÛÇœ'ˆdò3^Ö3˜Od¤EÓ=TrP%=KÒˆ$>A½ø@ÚXjˆ Ó™W„¹[Âp}¬Óx.a©Á9ü‘[ †îòiÊé¨Ú“ªé(Ô‘w¬¾“+~Z2;  ]´v­³kõŸ\ zÙb×1†HÒ·õnôkgJ ÂU¯¿ö„—¶ô‹ç@Ñפý)¤õá sþ˜[ù€p³ØŒBrĉ{ZÔÅÆ-Ÿd"LÔ5dî®ì¬ß3 :obvú+¦ Å^Š`ob½#Q/™Î‡t÷f¹¹çE¡¶Ä (+gK‚K¬jB4Yçdó“r“Ä>oûXæO«/ï9èñ] ²Ü0ªTÓ[‘Å–'£C©ÀsUÀ›™¸\±@r+ ¦\²øÜÇл´i+:¼ôìþ@›J©·¢IéðЗ÷ ×{¸P_ï®°;—ǪI5 *W!,°Rð™7U$= èÙ2)ºõ)Ç&¶„FšÞeqþßÐmS{ùÏÛdVØ>´¬~ãlx`xn4GXî±èH~øú‹¹¶b¾à'²¹]Õ[{—ûõê#]­Tö¹\âò÷««#æåèÔÈÜŠM[ލ® g"§UYº=:Îië! ðƹԌë‘ÝÆ8Šœ‹Ü2+t ›²eÞûgW¯Ìßôsò´ôă8UG4Ûß–/å”±VÂiµ°$C|ºC(cŒ/Èó+¬ü§\“¡k¢,”Mºi0M["žA»€ ÃLNzÔÎÎF¦ôüÉ$ím7;L‹§Q&ІŸù§™ËÕHõ¹ÁnwÝü´izR³üóÊá é"4x7Æmñ.¶O­¦W„JEiŠaùM|Oï‚0… ·Ë$ÔZµíðki&.''UõŠ ¼ÒþOAºj‡8ÍÑÞ„ç¼ðù’•ÍÛ†–}•.ŠšªÀ ^ L8Ó–ÑŠ¬Ûˆ¸9ÉË—áÀy#›3Ž©³‘u\c4°¹ %È^Í×Ô ¯—gî4Ć­cÛªºC2ç¡ô×%H3î{•Aœ¾ù¡Þy j |e_9ÅexEÇ)‰5ð,~±/äN¬µ©¾Ò©tŸèGüÐ.Fr5ŸþäTÒ½ER£® JàŽ6x¶ÿ·ÏëK2­QôÔñóÆü§3À‰bÌK²ðà°¿Õõ±ïeš!³†¸ ´÷–s:0º)æ%])(@pÊ…¼”÷GBçöÓ‘¾&”Ê7X“Ö! ܆Ùj¾ü]¶£d£‚ Óøœ…†¨3oÇhJÕ’t·-ëø¡<^ÊõZ\Õ…XêËÿ¯ê$´|R4Ç©ñß°~Es9Ø‚¸ÖMܳ“[]7„ûôïq-k´h£ok¬2ÍVžKƒ=Ú1¿§mc›ˆØÌÁŸgAþRLgE`ÛO)^Ÿ8x2#S†qOù°UnÂ:àëäÞ) '¾R×Õ¸ý;ºûp)¹ïe…¤é!B AEñðæV?7ÕõšÆøð¨°“ù3ц§ÊZzHJ¶Ž7N31@‡¸]Øëù°óÞ{ã=ªœ´GƒnXt–'‰cL6ô3˜J…©¯7…¡d~ë•élüª½”½s¹ß*‹Äx?å²I‰O,¨ÃÙ|­ºŠXbË ÒNdò!–Ó'7çð@ìIŒÿ”Àì¯ÔVböðJå1õÏ.dŒ¥ OLÐÓê ŠŒí¢¤GS7D`ØÙkÐ ¡¡d3g2ˆlSÇÁI¹: ÕrpÒ¯b1Ús§ËŠmJ=³ÇÃøK“*?+zöëõ.Brrþ½ð}ÜÓáBnÓóœ8–9ÒÕ§âk2‚ÜÊŒWßdN‘¤'$>ÓݺvÞÖ0ª“Ë«n~íèO5Á`¡òTWüIRO¯æmîg3´ù2"-gmÒ<ˆ¯p&\à –€ûk„^M8^¡]WC¶^X3¢ýÈ0­ä9Õ3žˆüôjNW1pÁé²IÄûÓýÖñÄ+ÖQG,ªà:•tù€'ÌÎÝ>PŒæd†&–ãxd¿: ëÂTF0¾ùaø"tçþâ¿zVP$•¡ž›ÊYo\²€ìÇÑ$7'Àˆ!Ÿè*™Ö¦ô`³‘ª9àÀösoлÄåm+0’=¹Ðd*·$ü;hd"Ÿ!ýܺ·Œ-OØéáÌßö™8®ëo›n'`1 (_z•Êœ)8ªæ¿ rìgÝ?‡yž›äÀã…ל^ïx5¥¹‡§utPâÁzí?îªö[MçÝ`;Oˆ”~îþáæçíSEÅä‘#*›+2ØíÞx»ª*˨ lýÕKµ¨ÁTïÊÑpò§²ýõÊÊ.ˆû|PžÂ¯àU³*‡Ö+ 찉ر @Û—«'Mª£WÄÙÉøÀÊ?g?äîç;-IGÂ’úˆÅOù[Á"¶ERQ5’1òû96+B X}ÎQC¿È¼|‹Áð Õc|ÒKÈ‘@4vªŠG«RP…Ô?ÏúÏRŽÁÆ”~˜Š˜<¨ƒ0ž…ÝõóûzµNgEÿÌÒrwW9QÅ€‡†zÃywàèG+>~ja²¿¯8õžÀTîDµ"^¿é£æ^g ¼zÎn늴ëm—qNÐj(‚ã‚ÆžŽ€e„úx ›Ÿ³g˜ßrüÈX&º]4>«£ž þKøãV—3 ñArô7CÄ™Pu,¸¦©=wÏÍÞ`èÅt{’Õ&XøŠ=çU›‚Y÷RmÆ/, ±ç ŒŒœß›ÞÐvPZ‚»Wàì2Ç´÷RYá–ù?pfÈ´ÆJQK+ë¹É`Z¿Lw¥¼ Ý5h{B¥m¥ èî7CQ4›‘!éÝíM±.À³Ä4%HУXš«ö(¨°‡LM–M<Š!Ú>ý™’Ô»Cd9»KÀk¿^âsD EÚ¼ Y½£¢kþÃFÒ¤·›š¢²Ç‚½4?å_†dãwm¾ œm´„ùÖ©ô%‹ãñ‘Ng¬²ãþ؉ \l÷ &óþކ> lštéVõbJ^?jí é¨ÇTVÒè¿”æ‹ÑcG€{}¬éI4›žÜš§HQöÙ‚ ÉêQ\>ƒ yÓAÚ¾0ÿ ¯·÷)¤çüìªL~ni™:ËZsÒøç>ú´Uúæwr'%`gq¦£Ïú·„UA»êÅ +èÓá1õÑ´zKvIÂÚ¦U"©¸Bgoµ ZÜ{e›ͺé&@k5+Re~“ê€÷9KºáúE´Ò‘صoÃ…h²þÁ¦]Sןœ$êuóaØÏ‰¼«Áú…„íél”ªÒNä¤ ´U _åb~Ö çnK$Kk×. ¼ÚJÕ¶{âÕ=súq˜ ×¹Cá1g¡—9&Ž v×4Gó!ŸiÓÆa7™¢Ymaâ*ÐÜbFï|ä9h8@ôx)‚gla²ÃJ=£zÖäÁ0…1(HÿÄ+kug£Ÿ'cÚÚ)ï¸ó“¿þœ ÄE r`!õÅ›LZ[ã~Q«§Ü»Áï˜÷xÂ+n+b4’ê®RÉAVp¤¼Òm¿ºhýu” J„_aþËé{¿FÔ·ëeÐåirf» ¨Ö2Ê{Trpìr‰S0ç!i£ã4_SÍZÍ‹cé~°Ö ÷QËp<(¹â†Cg±üÓåFÕŘ…s¨„†”¶«àCü”´…îÖZ ²y¾ãã +Ÿg½{7.Ås­üQV½ê\.vup n×Oµ<[àÖS'»ã5s(PMv˸tWmÛ5hs[íÈýÓZCý>Á%Þ\VóÇ…Ák«B#z…Š‹éLµCØæ]yc9“ºa'L þÀ+ú’“¦o—²ÿ‹›/¬_º~êîeÔú¼Ï5KêB¯þ´±>å“Ò‹1ÁU,k)¦V‚ÆjÄ5m‡éÁZŠK÷¾}sÏÿß0Õ7·E‡ËÝ<Ö´´Ì´¶}Õ ¤á³ÄcMd3 K¹tNï‘B¶'•°ä³,Èø½&"U±–˳ ¿Gbl­@ä0Šƒ"_=¼Ò<ßg˜õ¤Ú§ê㋞ ¢öè0Q‹6O¨&Ò¥Ëuý.Ã:÷/‡‘Ô€%Y:!_W7œ­á¸¯ƒáCÏÊ‚ÒW¶lç†:F}>å9ì¥*ñìÈy“{§WeÉ£·(mTTC0þüµ¬%(&^ú¶Ý–|j=÷Ü•÷Ê9pÀA"ÔP=â{‚¾8á7ÕV ±¡€œÙ*ì…}zªsŠf|™Æa "¼)§…¶ŠÁ™|hçÊîcÿU÷öNƒ–ÈØˆÕSCÄ‹Üx­ôIÔâÔÎ[ p8Ób*ƒjZH¹AaM¾‚#äù°]A©¹ll”~h*?÷{°Õ¿š)Mbè(Ö²Oa©öir~"ìã.¶lL£TŽP$^lPOʤJîzs`ˆK4cw³¹ 3ZŸÈ¥šS(§&~èú½/£ý [Ê+†Šñ¼ÈãºÌ©œnq¨2ÉOu  ’ù…ƒÑ¹šûµŽfÍ3ù-Iu- [ØFb,÷ANܱ‚ ²óè4„Í@g hÞE8U¨¤ïb36Ê|¢ü.Õs…1÷/ˆõ kµi½éæ°Ÿ«¦‡±×dãW¿ N»ƒ çmóùjtïHj!Uß×ý)äÈùáH¶…B â®…Ï%hÔã-ñ¤¾8u*þD$»!e»x<„¸À*ëmg}s%"LFð¦9IöÒ|n³î³Í­ox”ËjOÉs¿óxí[ua¢RÄük&¢±Öéí<Ÿœ¿TœÚ­B!<«‡ã–XÀB6_‹¹³Í Î’7 “ ù›ùµ(S^U¤&G±úÜõnaÒÍY«ª5è²e¤ÑÁ0çVèi¢¨[ÈÌ„Ýçvww‚ë/:¬Ñ¾ù»R'¯zúv•µBó¯ò†sâ@Š0mq<^4(À›fŒ /‘¾&ÑBÛn:cM4…¼ò3z§éõ1½/šÊ­X·˜páפ1 ò¦gó'ÇÖ2-Z£ÞþÉ—[ L+*f À"Hd”O£Ô0+SE^ÉÁ·+7Û3 ×-{ó2g|fh9ý»£åJ’•R^øïB,¿®9qi‰(aÑXÂ0†y?€?ñ;zÊûz²ÓÞ©ý‡âÓ°ëOi5„L:Dá)÷äUzÊ"…±îÎ…UZ´_ƒ¤ÎS}&œb}ª¥."ò¸Úæê°¯®5Oî<÷XÒÁ9]…î'|¡Xß+1LjÁ›JÖ[¾¹IÈÅŒ¡­BLQܱaD­½´‰2âÜ®Øx'@ÿ!nI]§Bk8A²_ þÝ3'&{åæPÊãÜèŠÇuF5d·ZZ¢plª ®LÈ3îXYœæRºxü †W(-VkÄQ)­Ip»Ø°„)õÎz°Ì|dö;‹ßå ‰ó¯}|šÀ§÷Eµá8lüWÒ›³FMðç))Ó·ó犈à Ä”uYòmÌ/æ«Ï{úÏ~ЮP¿€œ-‚\§û¯KÒéoI§Sïüg‡P¦€in96(œ}ÞÒüxP·¨¶Ê-ë &ÜQCÔ*%ä‘Îfn}"—ãÒ=hßQ¤¼±;SŒÉžEë6‰—gáË©`¸q}À¡yÛ×·’ÐëW$‘,C´t[qV=Q¾—ÙÎ6þÓ«¥“ssB_xr{)ßw4e3W*áŒuo¯ü ûÏñ¼ä{+6±nb®œp¬~GuAp%EŸ+µ„©³Æ¦4Lž$“bŽÇT­¸#ËOÝ_®fKa²±Œ´^ky#Å7é¿Ë5ü ™3yÊ<¦,lðå4ATÓÕ²«MëÅ«6È÷e£Ùέ8¶›±Û ;òÿ$½Ëެ³E¶$‹¥…fV¸d¿Aƒäܵ<ô“U’Ä£ #üäçõ;ä•=g¿É»Àrs:v׿ÁãÏLQõ<$¿¦q”O.á™®ˆ8Âù„DägîŸð˜U›P¤b2Þ£1S7ûæ/Hć÷Ç%r]*;Êq…2ëÌV»P¿ÃÁ£bǾ$åG þ… üÞÂO“¶. èWví™Óði•‹éi³n½nÎÂéAüsÒ†A·ì¼Ä¾oÎáI:ý^gŽÁ€•tŸC¼ls*…f×däÅ]ÒÞEQ¸#·eu÷=E‹ÏË=ø ™¼^þ{!2<ªÑiY$šÑ b»m"3ÔÖ==‘…_šËk²ˆ÷–·È¹ã_]¹²»eóŽšùA«(?ð‡¼/‚÷† îŽtRdcËܬ©FõSU'Hïµñ¯ª¶¿Óm„üHøÖ“ÿŠ(éFíQÝEŸ=eùWsF„»ŠÂÔ2m%6’û‘݉Íê™ÎDDû…´Û6鬊˜œ)wâñç¡¡¦ˆ™…D£]>v¡r5ͤæ›3M!Åß»€õÕJ Mׯïý‰ø+µ]†.ʧÇl-ì{Õ6²€˜I:^õ!¥fˆz÷/s`^‚¥U õy,µÍÞ1îwéÃQj-¿qQùáŒÀ —å%íó‰Ð'4OnX¶‹ô™žæØLxJ1ÆåK Ä!nW)"EÑùÍ„ƒ_õÅ`ͦQ^ѯ“*KQôÿ-W{*åè=2üL.H²ôA«þb!<1akD¹bÆP¯ í…O©‹5¾³>;±š:©•^팓)â9ËZÄiỆYT¦$»JX¯Û”ä¥ÚD§«µâ˜àâÓ Ãéó¶F"f¬?Ê]Efö ËÈòŸµ˜Ð–Ùεëºß_ñ¢ÂŠ(IÙ½PìnÛkQd{J‡ýb#ЙàK}?ðR/ê«îï)Û×~;*Ç6 \K’y‹ÕëZÀœœ‡ÌBb†œ —¹ mc «œtlÂEäÝL#§d€/’uÕ@(Í”F é;è#LÛWm)- ‘ʸ-gîþm7z]‰qž¼ÅP¬÷!; IpþŸ9¼¨’‰ÕñO­C¼k ÏšD>ÏdíˆÒÏ’&ÙTé®+ØE¬e}2…?]`øÊ¹ãÎahw.œN•ûQ–󢇀ʎ'ø&S2ÕÝ¥ìTšÿ0ÿ¿ Á£)[Ñ«œÊÓJøÅ‡Ñ©Ðûþ­f‹]X7~Ô>ŸMÍäŒæ¶ú¡¤°fëRÝô9xYê37ð%å-þ)…r¬êÿCæ¸ÒA™CÝß|Šr3iêePÉBão‹4g áçuð’O¶Õ" ËN÷² Þ‚’§ÿó>¦jp%X8¡:Ç1:S6[á·âÚ§ÛafMLÊ5ì5µÄÍ1ÄOC¢û#8xï¯ÎÔPH6¡Ol18Y3\þü’­~Wó ·çÃlgRÕ %†¿PB§®Ø—¼â€šh(ˆÕqÕ¡ okÈÀõxmq‹ õPžÎTê’*…cÈ϶»êîÅOâûG[¨k:/òK݈œy›ÚŽ Ân”)b®mÐPŨ"/ÛãO×72Á´MWÊ€6ÝÁ5ÄÂïUÏWGxeP'.:¸à‚ÚüÌ –G5O¶luNŠš€Íþ -ˆRÍ¿ÂI¿–~­W‡I£BAÞd¥omiŒ…åIµw¶ÀUÍc8*¡4••0ÇcZû;â;ŒD*h÷…»üK‡ßzNm˪«‡{e3ó΄ ‘”†ØèÚ¥w_2*ÁR…åò›Æ§tÞ˜Ž ò1}ö.oq/û}÷W‰Ô3]WˆäÄefÚõ¸ ¤7¹¸´: rÄU¶Ý@Û<Áw|Ø9©—Z£¸~–)¡§ª›K•c_a‡?»âÂO¨Àé…Ôî òJhÎ7I2úH3GYíÉ):åaFÆÐöLÒNXvæ1r^ ”굦i(IaÓUű¨ JÄjpF„ÝÙ Ù„(¹‰d7gå°½Œ¬bí²,˜ñcðÒŽ«¦>ý*4“Yöæ•¶anYh0å[È3“x^ĺ"ÜœƒÓôÿÁÑy¿ 4wpc©}çhb@Ð3RÙHÐý\èÃ=¦]‹Æíþþìgü´N?ãfœRóB¤vÝ6)!W ¤Òþ V¨Æ„ÏyQu’©Îáã9u˜zAÕWߨ1š¸;õ„æ7•N¢œÉØíHŒµ‘V«-4·/~ŠÆÏ¸´ºÏ×öÈÃ=fõ¤ e±¦¿Í a¾ËȆ ;%ÌmSaÐKË¥êæW¹”¨C£#~B˜}gý·'WqÌ*Õûœè|iÆ´í<¤Hù·ûKÒ¨ú+ukE4*vóCuãŽ!ƒ0¸Ü–hí&?éÙœÝÊÞ[>”|Øø{Íór6éà1qRÌ¿Xk êõ&Õcüxÿª‹øç¢žÓ'ü-ßË$Ÿ~Ú&\câ4Æ»™[mÚ»ô`Ê\ëS{ÆnŒ€±GÔȇÝ?·Îëö_lúÙËÙÜGTºëAëM•L4üo•€’¦.øLVM¼6Œ¶×œÑ4  Ã I¾r3ˆ›tÕS/¢Ã<'Er4Å—I3·ßh6ÀÄ-ÚÜ’3Ê ¨ˆˆËBûke‹½y—b4¿_ÎuŒT7’†óߢWÛL‘™6Ç*"CjR/¾ÜMIù6ÜŽøsÍOâeA- C‡1Ï‘Lœ(’¥¤­iDý{çlã»+³*Œ·i§Ï ¦Î«}|‹þÆÍD¼–d[Æ3 •taK< ¦“„·¿rèLª!Åvœ[ÚÒÅÓ ¹ ÅèϘ€cÁ²˜ŽïOC'·¤vPÌMb]š‘A«¸GŠF=¸¾Ð3&›äÔøò`ÿñçòfQRÐb¬ ´RYR!‰yä]½6†BŒ A‹«mi7ÂÓ‘u±Ì&?Ç\›R2ZÝ$©W]ƒõÜLdü=Á:3ÙÔÄÍœ ‰e·ˆOR²£œ5Sðrmõ¶†“ûÂCi'Î|(Y¬ˆo²ð¯…F¾ìòˆÖ çÿqì`„«·lB¥s.Nœí~ƒkº2µ‚$ÚÏû3TÚºa‹ÚYƱhpå¡„¡ØÊ(ß’WK Íörœ¥£ «VéK·dþˆ6MP£G© ‚7þåèh›õ¼ëŒÄñ<(ZŸ`>>,lËpÆòé+»ÏzÌ[b°9›=¨ˆ„XÄxk— p¹Gã!)á°8/p|_8¶!XC¦`Q6/&ñ&ÃŽ† üÐv°X“|nïg}Ä»Ü/–ZSŠÕ]eÕiUížÝÄ”aw)ðŠDR8ûn×dÅiaé´žVþ„˜,—`àñ(Ž:Íê< 6†Ò¹ÐõHê³7`×Ù:¶:ò®3d8WÔWÏx®oµ iÛ…v #êÈöÁÜÁÚö¤æâd7šZnAU)5üp­Ó¶ŒºF#¢bãKªå^ì7ŇÄÓ¿Ê4.Ž8 þV[ÙJÑ}PÛ¦h9RMGÈæÑò4_^Ý @LV3Z%ú¡¯Ê¦I3©Ï¬0Oá›ü‰ù}ø*w|¶é4=kñÏHh°‘ŽÎ͹G”b=b–‡eňÅ-þYÊO<kùîLuBVºe¹'¦ÒÁ³ªƒ9‚UÛÏT2à"tž’²WðîÉw’t…IHLéf×H¤Ÿ¶V*œÆ”.V@êÈÌœKzõöùÎÌîÕãC;"v‘È´É”XlLþb‰}Op@¨i‹ÏïÙíasJˆI^ÍÖ% 9ü&û+TµOc‰A7tp)ìLsŒ(½ ý’ܯ ñ9&6v¬¹3˱w-MuÁ’çž¼3K?E`´}>¾wȇ“êýZç”ÎnB&¸cö }ÛL•ÛE¬ºt/Ý’ô=@œù,B¡tô`žH,&€ùT…'ir-}™„ž~šfÊ4-s²éø°…YÈØ!1#túøºV«O„eìOIÆÚªñ×M¡´? ŠsàËIâ3øé1–øñ¿H¢ô`„åc=øÙÇ 4Xbí+Ö›_ÄhFÓ Î] ñeËMØ¥ p_À·iË ƒ¹aqYU 7ˆ…{§mR*¯ –ûåÄô $5 Q]*•¬Žë™ XV3uD;ÉÌË-q–<Ö²}} ±]n"9rrjÝY%«¹%³ë«Hø€ÒŒŽ“Bƒ÷·¢À㸟'Àá(ÌÆW„o'‚ÝBÔ`OTðÉã‚›N­$|ŸA–À$I=f ç*ô”9‡üÃ=Ñ<ºg'¯á:#·ê‡h‡Ê<ïª<v°à/¹~äóñÖ‘BL 놤ìœ×ó¢˜qySƒ‡è`oN™ÎÖŽ…,¨šV]Å5â}u‰3q‚x˜@o×óaÌõt{ïkÔa¿crš‡~À^Õfr¿N)HõËwpsƒp4Ugý ÒD5Öò Ÿ¸Né¯×éo¨Î…é˜iÞR+\|K¿v;˼Ôç›:¿ù…¥=r§²ŽöêÃC@ ÃÓ(M§ßÆ1Ž)y uøe¿[I[-ÿϸªUxÔ’½;…ÁzÝÚ#/.V¸Á?¦£îy‹4E<às×nÚ€_Eü©“ÊûÈn?Å_(ñY×_É8Þ£ ›}Á'¤c·Ä…–µ›â «$£ q|4?=‰@øN 4ò]å3!{È ¨°Ò4(VE鎪Uj?¬÷oJÙA)é´›°9 ~óE½3Ñ346 õ&ƒ–-X€9ܳt¹|…¬O9uoæñ?ÉCڮ蓋VàNÙ’ÆòàQ(„n”Ûç³(æ¡9_°Ð€÷…FœòÝ?ät»•ºù$ÆGË©E/ ÃÀ€ùÙ:¨¥—¢;1 9¢<=ƒ˜zŠ‚wÆS¾ä!:Jy™¯‰¯†î-¨±]Ç=¹=r›ñA‚5ƒ°~Û‰Êâ9&npVJ¤VoÃ]VÝPøaÆ7Ë•í2VQ³ì!÷hîAaJ¯³8á{<°E—Gºtq•ªÝˆxAKš(²«‘?à\„!¶/¸ŸÖe;)Ü ¨É?õì¡Ú¿££dvj8x2%åèê Ôön¤|>‰›æñF¸‘êq"ÐÄ…N1ÉúíÏœ4`WÙî’õ#;ga€‘d烈*:Il3¤…£qä?k6ÿ\‘kEÇ,9»ÛÅf§d˜ß½BLVÁõ1W˜(â2TÚqT\µH¯Þ±“ñܹA*ÓÊê­ÌÊvŒ&ÞÙÂá*´iz,§i>(±>åN\QT"¤åOýÿ² %WÓrŒó0,žM"­!€KŠTЗ:îGñ}ù8üB'3âí-Çq¡wù²ïA¦÷?°Ö— H7?&$¦CŠA(ÛÇÓÛwfµc¸J@t@ `=q†ÔU =“£H¤î«…³ÑmExwɸÊé4&–zŽhÇi˜W¶wå»´BØ“@’&ɶJÀuéQc‡ QSeóGïtng´Rm²H«cqñÓÎô–þÑ-û¯;±Í©&ê¶ë{’G\ß6nLÁM·5ǼSîv˜wRù—‚[hùUg~]F‰0§É¿èU'lÚ0,D ¡˜­ÿ}].Hã_ÿI®™óâ>Œkná&Ž¥†®›šÁª+³Fž¨YRñä;€ŒU)MjÅÖÏ/ш·n—–;À\ÖEsM¾òTÑöy Œ/ô’#Bél¦û9íBbt€¿#–Ùd“w%£üï V ~Õ–vç½»ª€Sœti7‹>õ·¼T–´—>àÃê‡îôïæ$'Ag–Ïn·`PÇ7E2V××ò=ͧG´s~Ü‹©›O‘¼„×ðc\BGÁNh¡æ·Í…¤&<ÐåÁŒ¢°.Úi¼v»©ȨǑï·•õ+Lj=ü5ÝgUË‘ +=‡êqzû8õݦú÷“,QuÝuìŒtYŠ»GÕ¹Á_ýiÀÌ #þbråSIZåVíÙŽF¾dì^„',¥™Â´Î)ÿ<>ÒÙéïœéü4vñÄtö\Ó.FÇ[÷Rük-µpWaÆßMÔTŒ€†Ç\`³'f¬IÌ æ(ò£fÅáñŠr»ST·Á[†—ÐÇ¿gñûûq6™ ÆÝ:vûs‰ÈÅ<Þm\hüôãsy{±'ù¡OûD'í!6;,>™¯/džc¦ŒÙ”1âfSÀP‹O«Ñv!D»OÎ_;ë5ÔøK«ZÜFŸ¦~SpgŨSǧd¶Y«51iC½Ñc<Œȑ–[—º§Ñ´J˜Ž•=M\¹î>«Í“–\ÿ&˜ãµÏ¥#ŸKý¬fdTìZ`KÌâ?¸‡ÄWÌûYÒS8-ÕbU?†,jU %YÕ‹*¿eg¢_*]S µ1Õñð2暌’†¬p†Œ MY\2-áž_÷N;ħûºŠµ)6%å«•‘9¯µÇ> ‰¾ÑÃý4A¹Ä‰Òk©–!;\âNóíx½gÐÚ­`%Çllƒ<°ÿ@l^æFmöpüÎCùÙÉò°7mÚM*Cof¤bO×ôѤ“èMýªz—íPÝZÊ1SYK{ñµÛ5ñªèd›fpãå9KäjöÛ¤.½Ë> +gÞžª’rh†m Cžd¢µ:^ÞE½÷¾Ó_uñ|•äPï‘»Kx»öeΫL B»˜õ{Ÿƒ“&(è<ràhK>ƒx#™ž=±iêõšw¬VÀ8OçZØ`àÏ$_½)–vo‚ñ5¸qà¡>ôÒ°˜AÍ^!T–ê”3¶ìeâuÏ E4LF>©Úw8þv ¹X"tÞ¯Q”Q­qØ3žç‚à㇧Öy©³yù¼Q$³óÃ|ÿ©ÑGt‚…A >“Šûó ®“­Îáhî£6 >Då)2·APƈ«,!é,ôÔûŒÖá"N? l„£ø! y9*QB”GÛ/Ø*ÙãÙVæy™ƒò|Ũùh°›ð˜ðE[MA«^ÛÄl`F N¯no‚æýI½…£$jh2 Xµ²ØÌw:*W—2¥%•€Y€~*¶a*rÇÚ¹§•(”ú–0­ÅsNû}è¯ UtÚß²Wëó˘¶p¿³ç÷Ë›Õ0i~U‹d;#5~ÙKÁS¶ÙýWøÉa@PÅ Ã_×¢ ŸOhzÆÞœŸšr(]¯ó ²UBl®Ù“PôQ9õ¥:qDUœòùÒ÷ÇÜâÌ ¢¼ý@3b Êïæ¡Ò ~êê~÷;à>±í´‚ô¬}Î1¯…|õE8´G)¸Q©qxåÓ(EÒaý˜ƒìd.Oõ=Hr)Œ¨rÅw&º|ÐRwþm|ª~AþH‚ gU4Ž7„ Ó6ˆ±ì‰n³ úh¨©âs8ë×’­XÑ%vns<è&z¬XEЃÂ( —‡1ò  ˆ­—ÏøÓÏÆX\½ó®8ÿMW@æøA!ieE;ÐçÕüþkgKëã²Ôû¸¿¥òácB£“*_ËÁ ¼Õ1Jøë|vL`ðϘk À²ÏÝÈ(¡÷âh<ð¹'ÒË;ðìðŠ¸¹zÄ ³©¶ÄÔ“\¦Óׯ>6iÁtÙ§f¾äAN~Ψ‘c~ƒ!d†â#kãíf»ënCQ‹ìS°Þ2Œ·ÙPµšAøÐùÉ@™Æÿõóªé¥ ~·›išÚ?¶««šÝÉÝó¨äÊ -«(Üó>J{bŸî ´`i†íý Pn¬¥$Ýpo‘ Z„×_øæZ5°YÌ«Æß~}˜ó’W»ÇëÖäÃHý”pñ{ñr9P-kƒr¥Tò;CúÌnFÒ§ëåÓp¡`<,ör\å_iܸ£¶›ÈÎ>æ¦ÀãÛHЦ‚G[ðÒ‹hfs‡z®µh‡Š‰è´ ›Eß÷+»Ìy¼ÀìY|ÄVI Y¦…ì…MîᯉoÆù^K쵃 `U‡ƒ“*kœ5Y6Í=Y+"/uò3œƒ¸kÈ ª+©= 5ÿôŠ»\|wšZO©ä“êP‘¶ ±ìAíg^~j+cb¬¥©QŸpxØ× ~ñD6N¹Yb~’äx£DKorzMÝQiã71иyŠM“]Ù»Î<ÛÉ^cÔ¥¢ê¨Wª}-6c8f×3shåz?+Sœ]ø>™ôîmδ\¢öéÝ=gA3Õ\»ßÓ¿ÆOZ+cü”< û\o:sr„‹N6;ºª: 'Ò°ZŠ{&{åà*Ûê×ôh í_©Õz{%ÂzFµ¹GÁ¿7óÞ °·â£QE±¯¦\Ã:pDžªmU\ÜÔ¬ Éi½$r´Í¤ÿ{döjµ ‰ƒb/1v\v¦‹›£ EÍ&³~˜ÝT0µåM×I¿îVñ/2ÈK.ZQ˜vœ7à:Pò´pûŸ‰vúįh[¦× ó!Ò·k Æ»eè‚Öƒ¢×±DÁœ$žÀ{ž×_@Ú«gŽ.h‡JMÆ"Ή ®„…1E(Jßj©Šº!šyop)ðwQQ,žÝÙ€çÙkÁÅq¯á‰ §Ç- Y©aLä·†…] 0îy²Ofõ¦‹Y½èú‹Â~¸î°r7š¨ÍHÐGá¶¥éá+–Ñð´Ä ƒ¼HꬔF`ሩ@ùKJå€úì_Nº@™Ö²îÚȰ¹¹¬'äu}’,òÓTÕD^HQº¿¦“ëa‘ã¸ä:o‡%î¨k~Ͼ8´£²ÖÜAªôÅ%^±sL;ÙtäÏþO»7eî:ûj v7`°y8Oá+@Q»}ÔNAÙî"kIo1Yr΀g td32úÁKŒ1†ÆýºƒZÏž[+cêÞ¿ Žƒ^ÕfD”*§í-dŠ¡.[H«Xò‚‚ ÊV,_çA$mºb]ôŽ\EFü„åÐåÄí§>&ÍßK²°ÞøÊÃÜ3[—òÎÄß7± ‡.ªÞV‰1¿Aÿè1'~1ÜÜ‚åî9Íú¶âœÅy,âÅ)6Í\ŒØìoEÃùXE;ìZ)Èy> endobj 2 0 obj << /Type /ObjStm /N 89 /First 713 /Length 3938 /Filter /FlateDecode >> stream xÚí[[wÛ8’~ׯàc²{Bw`Ovα¸“é8ÉØIO:i?È2cëXݺä2¿~¿*@eI;vv÷¡OwŠ P¬*|U(hJUa ]®ð²ˆ…¬$þ2ÚBêBa@šB+\|¡-:Ca\(”,l¥{J6àÎÊ.úBÅÂ+O2}Ð…ÖE€$mŠà"D´ƒ½¾Êèž…bS¹B‡BZ_÷^«Â@o¾0²P•q…Q…RfÈ´€qÝãÐê%îa„·¶‡aMÞ@*ðtðiaL–Wç Fb²l¬Å «0Ã$T:Ì\+ְ߫Ü/`ó7ÚãE¥ l%˜ õ W BÖ{]8(,¼)œƒ2LØW:ö<°6èô¡ðÞUE ÿ1+L((ÈÀ ‚XáŠ(É;U äCdt÷(V•ê9ø¥2&N£0©²Š˜˜¢€–Á¯R ¤âNð"<‰†#‘ôÌ#£¶=ò¸ª€ÃãJaJ•–|g­ƒ@åÐO1£(4õxô(hWŽQô&SP$©huOB;£Q4\%ÜV­ Í‘‡ÿ¥60%‹«C¤üùS+øÞÓ§…8*Ä/Í»¦ÏŠGÓz06ãR>.þö·Þ£?´wøçÿ`GD¾™éùöx«µ.æ€È°íËVֈȕ©èúœ¥·cÌuÕrÕD¦tÏOZõ[çñµ•À¢¿´· ÝT–¯ÿA¤$rØÚü53È£|Ãì»:Zý"DN‰4­–ñ-lºlŸ»…MzݦÝÖ‚º3»m*O6roÔ›•nP¹GäœÈ¼åEWï›Ö׳6Jš–uº]™YW¶¿ªgðRíO¦lÅÌ[l7Dè'$Ū8,ÄþpvLrŸ>í‰w߯êB¼íŸÕ=±×Œgõx6Ež$Æž8¬§Í|2¨§”d¹ç >öw›oŧ ¹ÍIu܃€ ž¤äÂl;ãq9Ÿhë •ÈtAã».éÎTé"ÓE¥‹N×ãÞŠµ,½'v›Éi=aCä±x!^Š=Ü ó“åƒYñIU:LFW¾”´Ÿèª È®ZƲr|Gó“dŠWÃñ…Øyú”5ˆF_‰÷‡/éߣóÙìê¿„¨Çå×áÅðŠ@(›É™ ;qП\œ6_ÇaäÙéµ,±÷aÖ¦¬hŸq¦Ä.aŒ-¥qw3s ;¿ÏçÃrÜ¿¬ÅÅx8›ˆæŠ8§âÇMÔ1–1À&…䯋.i5Z—êÿ‰NÉRÓÞ+à† À„RyÚŪ2Fõ6ž7ÍÅ},4ÞZØmYU¿/©¶—K©ÀÀ7Í‘^SM JÔ9(—°vh'/½Šw·ìl8;ŸŸ”ƒæ2™ì»‡o£/C%[ó`T©~Ð>˜7˜ôÇåd:›Ÿ6òª?¸@üï{ši¼,}¥,©8u>À±Él¥ Æ'õ·þåÕ¨žÞÃÐKƒ Œe-‘s¥ãâ¨Ú;Ã9¾æK=ùŽ(&æØ*·qª±rÑŽt JmÕ¬^´ ”r‡®E¡D0·èwtˆÊm>ªå6¥ñE›^Ô†yâí¤ÕˆcXÏö ñ®þ6KµÌ'CÛéqï“Ó¡D`3¹"S 7âü ÅÜîö§vˆ¦T\Ë`6X"™&žî¨ºm§ÑûÐ,“iÒÒ¥Ö¨V{p‘¨ôÔƒÚ ü £µ-éà­Ac¥™« Å0Æ“š^;àIeI‡e\Lf N“¬‡˜ÛX”x Aè-¬¬\ʰeK˜úŠv¶.©ú»¸Yà³h>;§½°(5òÓ©7£Âý®r0#õ$_å';ü‰Çx SeÊÞëŽ&ÌR›)"ÆhOþfj1u©¤Ú:ÏGµ£÷¡Y¦\jéR‹ªU.z©šá‚’Bn‘…ÇlqON/Ǫ$T-r;\Š„‰²›Oåu1S0†üé‰âvÐì Eê< {r§aNR-¥“­‰:lz‹ÔNý]Ô,Ê/ŸEóÊÌm+yÝ ³$!õg\RÔMÔ5IÎÏvø±i¥r›ý×eÔà_«Èƒ”P­t}XZm”[Ýðߪ5›Çna5ÍW¢U§Ì4!¯¼/}nwûSÛcÔe•2M<+£à×+ÒîC“œD“–.5^µ¶yªñ÷ØÝ=')x%[Ê0žÓSâÓNr”…ütŠˆ(å£$)õóóYƒ¦ägsU >¦²B¹bWº½PíÀÚÔÛ…+%¡ÆP î¶ue)Aux2È܄؂“Ü”Ÿíð'LŽÅÂ)>9®;J“I­DYw»$þ¢Ñ[ÐE¼ü7Ñ;Æ÷åNäʜҥc©ltE~C†B‡9µ¯øé@…ˆôD4\à&Ié9¦©í­ã²±ZjHœLee-ïbË.§¨v¦ãŸÉûDj§þ$´;šDë¸ÚLmª*µ\åHÏp¯¡j-݇Žy]îÄcP“c?DÊGòæJ¯;š¦ÃmZzéärGš¶“DCª:ÔJ®írÝPœé4ÁÛI€f€ªhƒÁ¹‹CâæsEÅnvžd³s p³` ŠJPo¹¤å6[tÚ'ןÆfµô9Þêè&QÇ@Þ;sIýÉæî(‰5¼RËVê×ËHPïüé>ÕüDË™Æ!ÏÑËXÌV-6ø4–ðIm¦ðòäK­×Hì×i‹¿MrõŽŽl]jø˜–{ØNu>xÃ5Žs|ú \öËÌ¥-qÙJ%©4/Â>ú<ž$Ò³Y¶ây«Z.¦²ªl{“¨T¨u!HíÔŸDvG“`ƒ+mE/ÒVx2Üo¥ã ‰z‚´¼høÙâÑ¡bê(œ¸Í£ôªÀó W²s5pøxâùÐá+: i†Ï.35…¸¥wgzŠëÄCý1KÈm>fÓ«¨¬#ñ1Î’¬Nb/#ãhí¤vêO»£$×HŸ5¤–¢¯ÚÑÄÍ}ѶOûÀ•$=³”ÃãÚq J9˜ÚÇ—‹ôBèY=L†W³f’^½î_bä×GÿøûÑíï~ ?ÄchÔ?›&ñìò_µž(‹'šþÜ \q £WË;Óÿq+♽þÕ‹zxvžoI=‘r^Îú£á`g|6ª ÍêËߺ=ñ!?ƒŠ"Îûz-ôHôÅ@ šË˾8µø<gâ\ ÅHŒE#®êɰ9131_ÄWñýq²už_F­¾YÝ>ùwþ¹ó>M^mŸ¼Î“w‘>\°?sò»â@Š#€ÐŸÎ0×é…8a.Ä%ÐŒkqEWÕŸg©5!AKdf瓺³¯ ¡³‚M¼ 6{¯Ÿ>ËØ³ ØX…LüS±ÙÏÅ>ðy“px|i掑 DI¦&K@æâÛj¸yHþñþíoïÉáA·…‹ŒÐ':HÏôò£Iˆ+Ðí]!ÑU’ñ  ¼¯rؼÌ  áµ“N‚äª]5_Å·ô]@xùqçåÛ Âö„!% % ‰ªk„•¨èÄDõ#³ßÃüÄë'âd>Õ3N £fÜM#”H>r.¹'7-¨?ÅŸó†–"õ‚Óúr˜Ä/2‚JükQ{D_ý²¿ób/!ª¶#j Qú–Mñ7T?7¬>ˆß3zuÆl<T!ð¥¦Ù§%õ¯zÒ¬LþN)ø—÷¿þ²¿›&ïUØ2yo(ÍЧSû‰?sò{ˆ¦~»‚(XÆ”UW¦x§LúüÍ«ß^cŠïÞmOJV˜"}D¨½£—»?eÅ-·•þŒÖKp1õ§çâdÒÔ¼¸•Â}±ŽŠúÏy$êoƒQÿ!q6é©ËÙT¢U÷!Sœ¿:GXPÂÕÓ)PÏ/OêÉtx–ÒÙ½XXW£ù”«_IHñNYù·Ã—ÏMðÞPÁT´QÑ'…ÚÓA)ü¤„´Ë{%䔎ßwwò»@¾H]§ÍhÔŸ\Çÿóf,}p±ðÂmÒÜšW8ãM‡4ï”òØÞÅ‚ŸOáÕA3©7g¿¸a?y>4§x‡Ÿ?×ÐNP}R!åeÔèyj8Útã&O?‰v7oœO‹6Ï$Á˜aÉSL³¡´Å¸Ð¤R‰ÀuU…µ)É¡~O‰/9e™úÛä’Œ~á 9˜B`wå}œºÄ œ–xw~-Þ཈Š"J±¨&—ñPDÛ¶ˆ~e'ç$L_w6¯+lNÝJ˜=± +ú¶µZÇ·òÈáä}œt–qF_©æöx}q¶_Ü){b·?­ù/Ñ+«™¾"æ/äö‡“錖SA;Á«~¾‘ Òþ9|ÍY/e„ö‡‹E¿ô"£ãÂÅgõAsZ‹÷Óz™Þ\ÕãôÕ-ýp0«ú§_P endstream endobj 102 0 obj << /Type /XRef /Index [0 103] /Size 103 /W [1 3 1] /Root 100 0 R /Info 101 0 R /ID [<594D3897D70FA0C5F77B8B3A191E4192> <594D3897D70FA0C5F77B8B3A191E4192>] /Length 236 /Filter /FlateDecode >> stream xÚÑG6`†áûý¢„D‚(ÑEï-zoA$!Q÷`ÌmÁ1¹‰-Ø‚…㽓ç¼ÃûkföÌ‚)¼eê‡k€ Ô@¡ µPCpõи„(4Â0”  b0EˆC3ŒB„h…6h‡è„.HC7ôÀ˜Ì¾­úàŽ`àÎ ‡p{‚]8…<ìÀ8lÃLÂLà ÌÂÌÃ,Â’,÷Ó–eå'¯¬ìåÓkEöõîµ*%½Ö¤JÕk]zþñÚªß^› é‚×\À ÜÂÜÃÂkþÿçûÉ“Á endstream endobj startxref 176644 %%EOF knitr/inst/doc/datatables.R0000644000175100001440000000064213142526153015374 0ustar hornikusers## ----cool, results='asis'------------------------------------------------ library(knitr) kable(mtcars, 'html', table.attr='id="mtcars_table"') ## ------------------------------------------------------------------------ options(markdown.HTML.header = system.file('misc', 'datatables.html', package = 'knitr')) ## ----boring, results='asis'---------------------------------------------- kable(head(mtcars), 'html') knitr/inst/doc/docco-classic.R0000644000175100001440000000152013142526154015773 0ustar hornikusers## ----hello, results='asis'----------------------------------------------- cat('_hello_ **markdown**!', '\n') ## ------------------------------------------------------------------------ 1+1 10:1 rnorm(5)^2 strsplit('hello, markdown vignettes', '') ## ------------------------------------------------------------------------ n=300; set.seed(123) par(mar=c(4,4,.1,.1)) plot(rnorm(n), rnorm(n), pch=21, cex=5*runif(n), col='white', bg='gray') ## ------------------------------------------------------------------------ head(knitr::rocco, 5) ## ----setup, echo=FALSE, results='asis'----------------------------------- x = readLines('docco-linear.Rmd')[-(1:7)] x = gsub('linear', 'classic', x) i = grep('^knit2html[(][.]{3}', x) x[i - 1] = '```{r}' x[i] = 'head(knitr::rocco, 5)' library(knitr) cat(knit_child(text = x, quiet = TRUE), sep = '\n') knitr/inst/doc/knitr-intro.R0000644000175100001440000000067713142526151015556 0ustar hornikusers## ----show-off, tidy=TRUE------------------------------------------------- options(digits=4) rnorm(20) fit=lm(dist~speed, data=cars) b=coef(fit) ## ----results='asis', echo=FALSE------------------------------------------ knitr::kable(summary(fit)$coefficients, caption='Regression coefficients.') ## ----graphics, fig.cap='A scatterplot with a regression line.'----------- par(mar=c(4, 4, 1, .1)) plot(cars, pch = 20) abline(fit, col = 'red') knitr/inst/doc/datatables.html0000644000175100001440000011102613142526153016136 0ustar hornikusers jQuery DataTables

jQuery DataTables

We can use the JavaScript library DataTables to generate enhanced tables in HTML. In the example below, we create a table for the mtcars data:

library(knitr)
kable(mtcars, "html", table.attr = "id=\"mtcars_table\"")
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2

Note we assigned an id to the table, and next we use the DataTables library to tweak the table.

<script type="text/javascript">
    $(document).ready(function() {
        $('#mtcars_table').DataTable();
    } );
</script>

Since this is a Markdown vignette, we need to add the JavaScript libraries as well as some additional CSS files to the HTML header, and this can be done via:

options(markdown.HTML.header = system.file("misc", "datatables.html", package = "knitr"))

The file datatables.html under the misc directory of knitr was added to the HTML output.

By comparison, below is an ordinary table:

kable(head(mtcars), "html")
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

This vignette is only a toy example. I'd recommend you to use the DT package instead: https://github.com/rstudio/DT

knitr/inst/doc/knitr-html.html0000644000175100001440000007577413142526153016146 0ustar hornikusers An R HTML vignette with knitr

This is an R HTML vignette. The file extension is *.Rhtml, and it has to include a special comment to tell R that this file needs to be compiled by knitr:

<!--
%\VignetteEngine{knitr::knitr}
%\VignetteIndexEntry{The Title of Your Vignette}
-->

Now you can write R code chunks:

summary(cars)
##      speed           dist    
##  Min.   : 4.0   Min.   :  2  
##  1st Qu.:12.0   1st Qu.: 26  
##  Median :15.0   Median : 36  
##  Mean   :15.4   Mean   : 43  
##  3rd Qu.:19.0   3rd Qu.: 56  
##  Max.   :25.0   Max.   :120
fit = lm(dist ~ speed, data = cars)
summary(fit)
## 
## Call:
## lm(formula = dist ~ speed, data = cars)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -29.07  -9.53  -2.27   9.21  43.20 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -17.579      6.758   -2.60    0.012 *  
## speed          3.932      0.416    9.46  1.5e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.4 on 48 degrees of freedom
## Multiple R-squared:  0.651,	Adjusted R-squared:  0.644 
## F-statistic: 89.6 on 1 and 48 DF,  p-value: 1.49e-12

You can also embed plots, for example:

par(mar = c(4, 4, 0.1, 0.1))
plot(cars, pch = 19)
plot of chunk cars-plot

For package vignettes, you need to encode images in base64 strings using the knitr::image_uri() function so that the image files are no longer needed after the vignette is compiled. For example, you can add this chunk in the beginning of a vignette:

library(knitr)
# to base64 encode images
opts_knit$set(upload.fun = image_uri)
knitr/inst/doc/knit_print.html0000644000175100001440000010415313142526150016213 0ustar hornikusers Custom Print Methods

Custom Print Methods

Yihui Xie

2017-08-09

Before knitr v1.6, printing objects in R code chunks basically emulates the R console. For example, a data frame is printed like this1:

head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

The text representation of the data frame above may look very familiar with most R users, but for reporting purposes, it may not be satisfactory – often times we want to see a table representation instead. That is the problem that the chunk option render and the S3 generic function knit_print() try to solve.

Customize Printing

After we evaluate each R expression in a code chunk, there is an object returned. For example, 1 + 1 returns 2. This object is passed to the chunk option render, which is a function with two arguments, x and options, or x and .... The default value for the render option is knit_print, an S3 function in knitr:

library(knitr)
knit_print  # an S3 generic function
## function (x, ...) 
## {
##     if (need_screenshot(x, ...)) {
##         html_screenshot(x)
##     }
##     else {
##         UseMethod("knit_print")
##     }
## }
## <environment: namespace:knitr>
methods(knit_print)
##  [1] knit_print.data.frame*     knit_print.default*       
##  [3] knit_print.grouped_df*     knit_print.html*          
##  [5] knit_print.knit_asis*      knit_print.knitr_kable*   
##  [7] knit_print.rowwise_df*     knit_print.shiny.tag*     
##  [9] knit_print.shiny.tag.list* knit_print.tbl_sql*       
## see '?methods' for accessing help and source code
getS3method("knit_print", "default")  # the default method
## function (x, ..., inline = FALSE) 
## {
##     if (inline) 
##         x
##     else normal_print(x)
## }
## <environment: namespace:knitr>
normal_print
## function (x, ...) 
## if (isS4(x)) methods::show(x) else print(x)
## <environment: namespace:evaluate>

As we can see, knit_print() has a default method, which is basically print() or show(), depending on whether the object is an S4 object. This means it does nothing special when printing R objects:

knit_print(1:10)
##  [1]  1  2  3  4  5  6  7  8  9 10
knit_print(head(mtcars))
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

S3 generic functions are extensible in the sense that we can define custom methods for them. A method knit_print.foo() will be applied to the object that has the class foo. Here is quick example of how we can print data frames as tables:

library(knitr)
# define a method for objects of the class data.frame
knit_print.data.frame = function(x, ...) {
    res = paste(c("", "", kable(x)), collapse = "\n")
    asis_output(res)
}

We expect the print method to return a character vector, or an object that can be coerced into a character vector. In the example above, the kable() function returns a character vector, which we pass to the asis_output() function so that later knitr knows that this result needs no special treatment (just write it as is), otherwise it depends on the chunk option results (= 'asis' / 'markup' / 'hide') how a normal character vector should be written. The function asis_output() has the same effect as results = 'asis', but saves us the effort to provide this chunk option explicitly. Now we check how the printing behavior is changed. We print a number, a character vector, a list, a data frame, and write a character value using cat() in the chunk below:

1 + 1
## [1] 2
head(letters)
## [1] "a" "b" "c" "d" "e" "f"
list(a = 1, b = 9:4)
## $a
## [1] 1
## 
## $b
## [1] 9 8 7 6 5 4
head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
cat("This is cool.")
## This is cool.

We see all objects except the data frame were printed “normallyâ€2. The data frame was printed as a real table. Note you do not have to use kable() to create tables – there are many other options such as xtable. Just make sure the print method returns a character string.

In the future, I may provide a companion package with knitr that includes appropriate printing methods so that users only need to load this package to get attractive printed results. A major factor to consider when defining a printing method is the output format. For example, the table syntax can be entirely different when the output is LaTeX vs when it is Markdown.

It is strongly recommended that your S3 method has a ... argument, so that your method can safely ignore arguments that are passed to knit_print() but not defined in your method. At the moment, a knit_print() method can have two optional arguments:

  • the options argument takes a list of the current chunk options;
  • the inline argument indicates if the method is called in code chunks or inline R code;

Depending on your application, you may optionally use these arguments. Here are some examples:

knit_print.classA = function(x, ...) {
  # ignore options and inline
}
knit_print.classB = function(x, options, ...) {
  # use the chunk option out.height
  asis_output(paste(
    '<iframe src="https://yihui.name" height="', options$out.height, '"></iframe>',
  ))
}
knit_print.classC = function(x, inline = FALSE, ...) {
  # different output according to inline=TRUE/FALSE
  if (inline) {
    'inline output for classC'
  } else {
    'chunk output for classC'
  }
}
knit_print.classD = function(x, options, inline = FALSE, ...) {
  # use both options and inline
}

A Low-level Explanation

You can skip this section if you do not care about the low-level implementation details.

The render option

As mentioned before, the chunk option render is a function that defaults to knit_print(). We can certainly use other render functions. For example, we create a dummy function that always says “I do not know what to print†no matter what objects it receives:

dummy_print = function(x, ...) {
    cat("I do not know what to print!")
    # this function implicitly returns an invisible NULL
}

Now we use the chunk option render = dummy_print:

1 + 1
## I do not know what to print!
head(letters)
## I do not know what to print!
list(a = 1, b = 9:4)
## I do not know what to print!
head(mtcars)
## I do not know what to print!
cat("This is cool.")
## This is cool.

Note the render function is only applied to visible objects. There are cases in which the objects returned are invisible, e.g. those wrapped in invisible().

1 + 1
## [1] 2
invisible(1 + 1)
invisible(head(mtcars))
x = 1:10  # invisibly returns 1:10

Metadata

The print function can have a side effect of passing “metadata†about objects to knitr, and knitr will collect this information as it prints objects. The motivation of collecting metadata is to store external dependencies of the objects to be printed. Normally we print an object only to obtain a text representation, but there are cases that can be more complicated. For example, a ggvis graph requires external JavaScript and CSS dependencies such as ggvis.js. The graph itself is basically a fragment of JavaScript code, which will not work unless the required libraries are loaded (in the HTML header). Therefore we need to collect the dependencies of an object beside printing the object itself.

One way to specify the dependencies is through the meta argument of asis_output(). Here is a pseudo example:

# pseudo code
knit_print.ggvis = function(x, ...) {
  res = ggvis::print_this_object(x)
  knitr::asis_output(res, meta = list(
    ggvis = list(
      version = '0.1.0',
      js  = system.file('www', 'js',  'ggvis.js',  package = 'ggvis'),
      css = system.file('www', 'www', 'ggvis.css', package = 'ggvis')
    )
  ))
}

Then when knitr prints a ggvis object, the meta information will be collected and stored. After knitting is done, we can obtain a list of all the dependencies via knit_meta(). It is very likely that there are duplicate entries in the list, and it is up to the package authors to clean them up, and process the metadata list in their own way (e.g. write the dependencies into the HTML header). We give a few more quick and dirty examples below to see how knit_meta() works.

Now we define a print method for foo objects:

library(knitr)
knit_print.foo = function(x, ...) {
  res = paste('**This is a `foo` object**:', x)
  asis_output(res, meta = list(
    js  = system.file('www', 'shared', 'shiny.js',  package = 'shiny'),
    css = system.file('www', 'shared', 'shiny.css', package = 'shiny')
  ))
}

See what happens when we print foo objects:

new_foo = function(x) structure(x, class = "foo")
new_foo("hello")

This is a foo object: hello

Check the metadata now:

str(knit_meta(clean = FALSE))
## List of 2
##  $ js : chr "/Users/yihui/R/shiny/www/shared/shiny.js"
##  $ css: chr "/Users/yihui/R/shiny/www/shared/shiny.css"
##  - attr(*, "knit_meta_id")= chr [1:2] "unnamed-chunk-9" "unnamed-chunk-9"

Another foo object:

new_foo("world")

This is a foo object: world

Similarly for bar objects:

knit_print.bar = function(x, ...) {
    asis_output(x, meta = list(head = "<script>console.log(\"bar!\")</script>"))
}
new_bar = function(x) structure(x, class = "bar")
new_bar("**hello** world!")

hello world!

new_bar("hello **world**!")

hello world!

The final version of the metadata, and clean it up:

str(knit_meta())
## List of 6
##  $ js  : chr "/Users/yihui/R/shiny/www/shared/shiny.js"
##  $ css : chr "/Users/yihui/R/shiny/www/shared/shiny.css"
##  $ js  : chr "/Users/yihui/R/shiny/www/shared/shiny.js"
##  $ css : chr "/Users/yihui/R/shiny/www/shared/shiny.css"
##  $ head: chr "<script>console.log(\"bar!\")</script>"
##  $ head: chr "<script>console.log(\"bar!\")</script>"
##  - attr(*, "knit_meta_id")= chr [1:6] "unnamed-chunk-9" "unnamed-chunk-9" "unnamed-chunk-11" "unnamed-chunk-11" ...
str(knit_meta())  # empty now, because clean = TRUE by default
##  list()

For package authors

If you are implementing a custom print method in your own package, here are two hints:

  1. knit_print() is an S3 generic function in knitr, so in theory you need to import it in your namespace via importFrom(knitr, knit_print), but due to the “lack of rigor†of the S3 system, you can choose not to import knitr, and just do export(knit_print.foo) in the namespace, then R will find the S3 “method†after your package is attached via library(), because it is essentially a normal R function;
  2. asis_output() is simply a function that marks an object with the class knit_asis, and you do not have to import this function to your package, either – just let your print method return structure(x, class = 'knit_asis'), and if there are additional metadata, just put it in the knit_meta attribute; here is the source code of this function:

    knitr::asis_output
    ## function (x, meta = NULL, cacheable = NA) 
    ## {
    ##     structure(x, class = "knit_asis", knit_meta = meta, knit_cacheable = cacheable)
    ## }
    ## <environment: namespace:knitr>

If you are worried about possible future changes in asis_output(), you can put knitr in the Suggests field in DESCRIPTION, and use knitr::asis_output(), so that you can avoid the “hard†dependency on knitr.


  1. Note R prints an object without an explicit print() call when it is visible; see ?invisible↩

  2. The two hashes ## were from the chunk option comment; you can turn them off by comment = ''.↩

knitr/inst/opencpu/0000755000175100001440000000000012304662017014046 5ustar hornikusersknitr/inst/opencpu/apps/0000755000175100001440000000000012304670325015012 5ustar hornikusersknitr/inst/opencpu/apps/index.html0000644000175100001440000000517312427502655017023 0ustar hornikusers R Notebook: A knitr app on OpenCPU
knitr/inst/themes/0000755000175100001440000000000012304667513013670 5ustar hornikusersknitr/inst/themes/rdark.css0000644000175100001440000000042512235534375015510 0ustar hornikusers.background { color: #1e2426; } .num { color: #8ae234; } .str { color: #8ae234; } .com { color: #656763; } .opt { color: #babdb6; } .std { color: #babdb6; } .kwa { color: #729fcf; } .kwb { color: #e3e7df; } .kwc { color: #cfa272; } .kwd { color: #9ebd77; } knitr/inst/themes/edit-nedit.css0000644000175100001440000000057712235534400016430 0ustar hornikusers.background { color: #ffffff; } .num { color: #006400; } .str { color: #006400; } .com { color: #000000; font-style: italic; } .opt { color: #000000; font-weight: bold; } .std { color: #000000; } .kwa { color: #000000; font-weight: bold; } .kwb { color: #a52a2a; font-weight: bold; } .kwc { color: #dda0dd; font-weight: bold; } .kwd { color: #000000; } knitr/inst/themes/edit-eclipse.css0000644000175100001440000000052412235534374016753 0ustar hornikusers.background { color: #ffffff; } .num { color: #000000; } .str { color: #0000ff; } .com { color: #717ab3; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #7f0055; font-weight: bold; } .kwb { color: #7f0055; font-weight: bold; } .kwc { color: #7f0055; font-weight: bold; } .kwd { color: #000000; } knitr/inst/themes/edit-matlab.css0000644000175100001440000000042512235534375016570 0ustar hornikusers.background { color: #ffffff; } .num { color: #000000; } .str { color: #800000; } .com { color: #000000; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #0000ff; } .kwb { color: #000000; } .kwc { color: #0000ff; } .kwd { color: #000000; } knitr/inst/themes/aiseered.css0000644000175100001440000000050012235534377016162 0ustar hornikusers.background { color: #600000; } .num { color: #88ddee; } .str { color: #ffcc88; } .com { color: #ffffff; font-style: italic; } .opt { color: #ffcc33; } .std { color: #f08080; } .kwa { color: #eeff99; font-weight: bold; } .kwb { color: #88ffaa; } .kwc { color: #aa99ff; } .kwd { color: #f0b77f; } knitr/inst/themes/andes.css0000644000175100001440000000042512235534375015477 0ustar hornikusers.background { color: #0f0f0f; } .num { color: #dfaf87; } .str { color: #ffff77; } .com { color: #33ff00; } .opt { color: #ff00cc; } .std { color: #f0f0f0; } .kwa { color: #66aaff; } .kwb { color: #66ff99; } .kwc { color: #cc9966; } .kwd { color: #ff99aa; } knitr/inst/themes/solarized-light.css0000644000175100001440000000042512235534400017473 0ustar hornikusers.background { color: #fdf6e3; } .num { color: #dc322f; } .str { color: #dc322f; } .com { color: #93a1a1; } .opt { color: #586e75; } .std { color: #657b83; } .kwa { color: #cb4b16; } .kwb { color: #859900; } .kwc { color: #cb4b16; } .kwd { color: #586e75; } knitr/inst/themes/edit-kwrite.css0000644000175100001440000000052512235534376016637 0ustar hornikusers.background { color: #E0EAEE; } .num { color: #B07E00; } .str { color: #BF0303; } .com { color: #838183; font-style: italic; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #000000; font-weight: bold; } .kwb { color: #0057AE; } .kwc { color: #000000; font-weight: bold; } .kwd { color: #010181; } knitr/inst/themes/golden.css0000644000175100001440000000055212235534376015657 0ustar hornikusers.background { color: #000000; } .num { color: #ffffff; } .str { color: #ff0000; } .com { color: #978345; font-style: italic; } .opt { color: #ababab; } .std { color: #ddbb00; } .kwa { color: #ffed8a; font-weight: bold; } .kwb { color: #ffed8a; } .kwc { color: #dedede; font-weight: bold; } .kwd { color: #ddbb00; font-weight: bold; } knitr/inst/themes/navy.css0000644000175100001440000000050012235534374015353 0ustar hornikusers.background { color: #000035; } .num { color: #f87ff4; } .str { color: #ff7f66; } .com { color: #ffbb00; font-style: italic; } .opt { color: #ffffff; } .std { color: #008bff; } .kwa { color: #f8c50b; font-weight: bold; } .kwb { color: #e1e72f; } .kwc { color: #13d8ef; } .kwd { color: #ffffff; } knitr/inst/themes/nightshimmer.css0000644000175100001440000000042512235534400017070 0ustar hornikusers.background { color: #103040; } .num { color: #00ffff; } .str { color: #00ffff; } .com { color: #507080; } .opt { color: #e0eee0; } .std { color: #e0eee0; } .kwa { color: #90ee90; } .kwb { color: #add8e6; } .kwc { color: #cc99ff; } .kwd { color: #ff9999; } knitr/inst/themes/bclear.css0000644000175100001440000000042512235534377015637 0ustar hornikusers.background { color: #ffffff; } .num { color: #1094a0; } .str { color: #1094a0; } .com { color: #969696; } .opt { color: #323232; } .std { color: #323232; } .kwa { color: #3b6ac8; } .kwb { color: #a00050; } .kwc { color: #00a150; } .kwd { color: #c73a69; } knitr/inst/themes/zellner.css0000644000175100001440000000045212235534377016062 0ustar hornikusers.background { color: #ffffff; } .num { color: #ff0066; } .str { color: #ff00ff; } .com { color: #ff0000; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #a52a2a; } .kwb { color: #0000ff; } .kwc { color: #225f2d; } .kwd { color: #000000; font-weight: bold; } knitr/inst/themes/greenlcd.css0000644000175100001440000000050012235534400016147 0ustar hornikusers.background { color: #003000; } .num { color: #3399cc; } .str { color: #dfdfdf; } .com { color: #888888; font-style: italic; } .opt { color: #2fe7a9; } .std { color: #00bb00; } .kwa { color: #00ed00; font-weight: bold; } .kwb { color: #00ed00; } .kwc { color: #beef13; } .kwd { color: #c0ff73; } knitr/inst/themes/matrix.css0000644000175100001440000000047712235534377015722 0ustar hornikusers.background { color: #000000; } .num { color: #55ff55; } .str { color: #ccff33; } .com { color: #226622; } .opt { color: #44cc44; } .std { color: #44cc44; } .kwa { color: #55ff55; font-weight: bold; } .kwb { color: #aaff54; font-weight: bold; } .kwc { color: #48d990; } .kwd { color: #54ffaa; } knitr/inst/themes/greyscale1.css0000644000175100001440000000050012251440775016434 0ustar hornikusers.background { color: #ffffff; } .num { color: #4D4D4D; } .str { color: #4D4D4D; } .com { font-style: italic; color: #808080; } .opt { color: #1A1A1A; } .std { color: #1A1A1A; } .kwa { color: #1A1A1A; } .kwb { color: #1A1A1A; } .kwc { color: #4D4D4D; } .kwd { font-weight: bold; color: #1A1A1A; } knitr/inst/themes/edit-xcode.css0000644000175100001440000000042512235534375016432 0ustar hornikusers.background { color: #ffffff; } .num { color: #2300ff; } .str { color: #c00000; } .com { color: #007f1c; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #8f0055; } .kwb { color: #8f0055; } .kwc { color: #8f0055; } .kwd { color: #000000; } knitr/inst/themes/fine_blue.css0000644000175100001440000000057712235534374016344 0ustar hornikusers.background { color: #f8f8f8; } .num { color: #2020ff; } .str { color: #2020ff; } .com { color: #ff00c0; font-style: italic; } .opt { color: #404048; } .std { color: #404048; } .kwa { color: #008858; font-weight: bold; } .kwb { color: #7040ff; font-weight: bold; } .kwc { color: #87002f; font-weight: bold; } .kwd { color: #404048; font-weight: bold; } knitr/inst/themes/breeze.css0000644000175100001440000000042512235534377015663 0ustar hornikusers.background { color: #005c70; } .num { color: #60ffff; } .str { color: #60ffff; } .com { color: #c8d0d0; } .opt { color: #ffffff; } .std { color: #ffffff; } .kwa { color: #ffff80; } .kwb { color: #80ffa0; } .kwc { color: #7f7fff; } .kwd { color: #ff7fff; } knitr/inst/themes/edit-gedit.css0000644000175100001440000000045212235534375016424 0ustar hornikusers.background { color: #ffffff; } .num { color: #FF00FF; } .str { color: #FF00FF; } .com { color: #003CFF; } .opt { color: #3A3935; } .std { color: #3A3935; } .kwa { color: #A52A35; } .kwb { color: #2E8B57; } .kwc { color: #572e8c; } .kwd { color: #3A3935; font-weight: bold; } knitr/inst/themes/blacknblue.css0000644000175100001440000000052512235534400016475 0ustar hornikusers.background { color: #000000; } .num { color: #cc3366; } .str { color: #cfc631; } .com { color: #c47b6a; font-style: italic; } .opt { color: #ccc6c6; } .std { color: #22a0d6; } .kwa { color: #1ededc; font-weight: bold; } .kwb { color: #c06cf8; font-weight: bold; } .kwc { color: #00ff99; } .kwd { color: #1ceddc; } knitr/inst/themes/darkness.css0000644000175100001440000000047712235534377016230 0ustar hornikusers.background { color: #000000; } .num { color: #619de7; } .str { color: #abab00; font-weight: bold; } .com { color: #008888; } .opt { color: #ff00ff; } .std { color: #ffffff; } .kwa { color: #ffff00; font-weight: bold; } .kwb { color: #00ff00; } .kwc { color: #26e0e7; } .kwd { color: #f34627; } knitr/inst/themes/bright.css0000644000175100001440000000042512235534400015651 0ustar hornikusers.background { color: #ffffff; } .num { color: #32ba06; } .str { color: #1861a7; } .com { color: #006633; } .opt { color: #555555; } .std { color: #330066; } .kwa { color: #ff3030; } .kwb { color: #F48C23; } .kwc { color: #0000ff; } .kwd { color: #d11ced; } knitr/inst/themes/greyscale2.css0000644000175100001440000000050012251440775016435 0ustar hornikusers.background { color: #ffffff; } .num { color: #666666; } .str { color: #666666; } .com { font-style: italic; color: #B3B3B3; } .opt { color: #1A1A1A; } .std { color: #1A1A1A; } .kwa { color: #1A1A1A; } .kwb { color: #1A1A1A; } .kwc { color: #666666; } .kwd { font-weight: bold; color: #1A1A1A; } knitr/inst/themes/edit-emacs.css0000644000175100001440000000050012235534376016413 0ustar hornikusers.background { color: #ffffff; } .num { color: #000000; } .str { color: #bd8d8b; } .com { color: #ac2020; font-style: italic; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #9c20ee; font-weight: bold; } .kwb { color: #208920; } .kwc { color: #0000ff; } .kwd { color: #000000; } knitr/inst/themes/edit-jedit.css0000644000175100001440000000052412235534377016431 0ustar hornikusers.background { color: #ffffff; } .num { color: #ff0000; } .str { color: #ff00cc; } .com { color: #cc0000; } .opt { color: #000000; font-weight: bold; } .std { color: #000000; } .kwa { color: #009966; font-weight: bold; } .kwb { color: #009966; font-weight: bold; } .kwc { color: #0099ff; } .kwd { color: #9966ff; } knitr/inst/themes/rootwater.css0000644000175100001440000000042512235534400016420 0ustar hornikusers.background { color: #151b1d; } .num { color: #77dd88; } .str { color: #77dd88; } .com { color: #656565; } .opt { color: #babdb6; } .std { color: #babdb6; } .kwa { color: #8fffff; } .kwb { color: #ffffff; } .kwc { color: #ff8f8f; } .kwd { color: #ededed; } knitr/inst/themes/orion.css0000644000175100001440000000042512235534376015534 0ustar hornikusers.background { color: #1E1616; } .num { color: #9C928C; } .str { color: #635D63; } .com { color: #C4674A; } .opt { color: #7B94AD; } .std { color: #C4B1A8; } .kwa { color: #49d4d6; } .kwb { color: #BA1919; } .kwc { color: #7B2421; } .kwd { color: #AD5139; } knitr/inst/themes/solarized-dark.css0000644000175100001440000000042512235534374017317 0ustar hornikusers.background { color: #002b36; } .num { color: #dc322f; } .str { color: #dc322f; } .com { color: #586e75; } .opt { color: #93a1a1; } .std { color: #839496; } .kwa { color: #cb4b16; } .kwb { color: #859900; } .kwc { color: #cb4b16; } .kwd { color: #93a1a1; } knitr/inst/themes/whitengrey.css0000644000175100001440000000052512235534377016575 0ustar hornikusers.background { color: #ffffff; } .num { color: #bb00ff; } .str { color: #008800; } .com { color: #1326a2; font-style: italic; } .opt { color: #696969; } .std { color: #696969; } .kwa { color: #696969; font-weight: bold; } .kwb { color: #696969; } .kwc { color: #696969; font-weight: bold; } .kwd { color: #000000; } knitr/inst/themes/maroloccio.css0000644000175100001440000000042512235534400016521 0ustar hornikusers.background { color: #1a202a; } .num { color: #8b8b00; } .str { color: #5B5BD0; } .com { color: #006666; } .opt { color: #8b9aaa; } .std { color: #8b9aaa; } .kwa { color: #9966cc; } .kwb { color: #ffcc00; } .kwc { color: #cc6666; } .kwd { color: #99cc66; } knitr/inst/themes/edit-vim.css0000644000175100001440000000042512235534375016123 0ustar hornikusers.background { color: #ffffff; } .num { color: #ff0000; } .str { color: #ff0000; } .com { color: #0000ff; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #B26818; } .kwb { color: #00ff00; } .kwc { color: #B26818; } .kwd { color: #000000; } knitr/inst/themes/seashell.css0000644000175100001440000000052412235534374016204 0ustar hornikusers.background { color: #fff5ee; } .num { color: #ff1493; } .str { color: #ff1493; } .com { color: #2929cc; } .opt { color: #676767; } .std { color: #000000; } .kwa { color: #2e8b57; font-weight: bold; } .kwb { color: #2e8b57; font-weight: bold; } .kwc { color: #696969; font-weight: bold; } .kwd { color: #00008f; } knitr/inst/themes/moria.css0000644000175100001440000000047712235534376015524 0ustar hornikusers.background { color: #202020; } .num { color: #87df71; } .str { color: #87df71; } .com { color: #d0d0a0; } .opt { color: #d0d0d0; } .std { color: #d0d0d0; } .kwa { color: #7ec0ee; font-weight: bold; } .kwb { color: #f09479; font-weight: bold; } .kwc { color: #87ed7e; } .kwd { color: #e47eed; } knitr/inst/themes/rand01.css0000644000175100001440000000052512235534377015475 0ustar hornikusers.background { color: #ffffff; } .num { color: #0da344; } .str { color: #2b83ba; } .com { color: #ababab; font-style: italic; } .opt { color: #0000de; } .std { color: #121b28; } .kwa { color: #0a7f6d; font-weight: bold; } .kwb { color: #c42638; font-weight: bold; } .kwc { color: #e12f76; } .kwd { color: #2ac749; } knitr/inst/themes/edit-flashdevelop.css0000644000175100001440000000045212235534377020006 0ustar hornikusers.background { color: #ffffff; } .num { color: #0000ff; font-weight: bold; } .str { color: #a31515; } .com { color: #606060; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #0000ff; } .kwb { color: #0000ff; } .kwc { color: #2b91af; } .kwd { color: #2b91af; } knitr/inst/themes/darkspectrum.css0000644000175100001440000000047712235534400017105 0ustar hornikusers.background { color: #2A2A2A; } .num { color: #fce94f; } .str { color: #fce94f; } .com { color: #8a8a8a; } .opt { color: #efefef; } .std { color: #efefef; } .kwa { color: #ffffff; font-weight: bold; } .kwb { color: #8ae234; font-weight: bold; } .kwc { color: #34e3e3; } .kwd { color: #efefef; } knitr/inst/themes/print.css0000644000175100001440000000062412235534376015543 0ustar hornikusers.background { color: #ffffff; } .num { color: #000000; } .str { color: #000000; } .com { color: #666666; font-style: italic; } .opt { color: #000000; font-weight: bold; } .std { color: #000000; } .kwa { color: #000000; font-weight: bold; } .kwb { color: #000000; font-weight: bold; } .kwc { color: #000000; font-weight: bold; } .kwd { color: #000000; font-weight: bold; } knitr/inst/themes/darkbone.css0000644000175100001440000000042512235534375016172 0ustar hornikusers.background { color: #000000; } .num { color: #d0e080; } .str { color: #d0e080; } .com { color: #606080; } .opt { color: #cccccc; } .std { color: #a0a0c0; } .kwa { color: #8090f0; } .kwb { color: #e0e0ff; } .kwc { color: #7ff0a6; } .kwd { color: #9fbfaf; } knitr/inst/themes/candy.css0000644000175100001440000000045312235534374015503 0ustar hornikusers.background { color: #000000; } .num { color: #90d0ff; } .str { color: #90d0ff; } .com { color: #c0c0d0; font-style: italic; } .opt { color: #f0f0f8; } .std { color: #f0f0f8; } .kwa { color: #ffa0ff; } .kwb { color: #ffc864; } .kwc { color: #ffffa1; } .kwd { color: #ff5c33; } knitr/inst/themes/tabula.css0000644000175100001440000000045212235534376015656 0ustar hornikusers.background { color: #004A41; } .num { color: #00A7F7; } .str { color: #00DF00; } .com { color: #00C5E7; } .opt { color: #71D289; } .std { color: #71D289; } .kwa { color: #DEDE00; font-weight: bold; } .kwb { color: #F269E4; } .kwc { color: #ffffff; } .kwd { color: #ff7f00; } knitr/inst/themes/darkblue.css0000644000175100001440000000045212235534375016176 0ustar hornikusers.background { color: #000040; } .num { color: #42cad9; } .str { color: #ffa0a0; } .com { color: #80a0ff; } .opt { color: #bababa; } .std { color: #ffffff; } .kwa { color: #e2e825; } .kwb { color: #60ff60; } .kwc { color: #e88d25; } .kwd { color: #e825e2; font-weight: bold; } knitr/inst/themes/edit-vim-dark.css0000644000175100001440000000042512235534375017042 0ustar hornikusers.background { color: #000000; } .num { color: #ff0000; } .str { color: #ff0000; } .com { color: #0000ff; } .opt { color: #ffffff; } .std { color: #ffffff; } .kwa { color: #B26818; } .kwb { color: #00ff00; } .kwc { color: #B26818; } .kwd { color: #ffffff; } knitr/inst/themes/biogoo.css0000644000175100001440000000045212235534374015662 0ustar hornikusers.background { color: #d6d6d6; } .num { color: #b85d00; } .str { color: #d10000; } .com { color: #0000c3; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #00007f; } .kwb { color: #540054; font-weight: bold; } .kwc { color: #005400; } .kwd { color: #002a54; } knitr/inst/themes/greyscale0.css0000644000175100001440000000050012251440775016433 0ustar hornikusers.background { color: #ffffff; } .num { color: #333333; } .str { color: #333333; } .com { font-style: italic; color: #4D4D4D; } .opt { color: #1A1A1A; } .std { color: #1A1A1A; } .kwa { color: #1A1A1A; } .kwb { color: #1A1A1A; } .kwc { color: #333333; } .kwd { font-weight: bold; color: #1A1A1A; } knitr/inst/themes/baycomb.css0000644000175100001440000000045212235534377016023 0ustar hornikusers.background { color: #11121a; } .num { color: #4580b4; } .str { color: #5c78f0; } .com { color: #349d58; } .opt { color: #b0b0b0; } .std { color: #a0b4e0; } .kwa { color: #fca8ad; } .kwb { color: #0490e8; font-weight: bold; } .kwc { color: #a9fcf7; } .kwd { color: #b4e09f; } knitr/inst/themes/night.css0000644000175100001440000000042512235534374015515 0ustar hornikusers.background { color: #303040; } .num { color: #b8b8c8; } .str { color: #f0f0f8; } .com { color: #e0e070; } .opt { color: #f0f0f8; } .std { color: #f0f0f8; } .kwa { color: #00d8f8; } .kwb { color: #bbaaff; } .kwc { color: #9d00f7; } .kwd { color: #cc66cc; } knitr/inst/themes/earendel.css0000644000175100001440000000052412235534374016163 0ustar hornikusers.background { color: #ffffff; } .num { color: #a8660d; } .str { color: #a8660d; } .com { color: #558817; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #2239a8; font-weight: bold; } .kwb { color: #8c1d69; font-weight: bold; } .kwc { color: #a89222; font-weight: bold; } .kwd { color: #a8227b; } knitr/inst/themes/dusk.css0000644000175100001440000000042512235534376015354 0ustar hornikusers.background { color: #1f3048; } .num { color: #cdb7b5; } .str { color: #9ac0cd; } .com { color: #708090; } .opt { color: #fffff0; } .std { color: #fffff0; } .kwa { color: #f0e68c; } .kwb { color: #ffdead; } .kwc { color: #8bf0b3; } .kwd { color: #8bf0e6; } knitr/inst/themes/autumn.css0000644000175100001440000000042512235534377015720 0ustar hornikusers.background { color: #fff4e8; } .num { color: #00884c; } .str { color: #00884c; } .com { color: #ff5050; } .opt { color: #404040; } .std { color: #404040; } .kwa { color: #80a030; } .kwb { color: #b06c58; } .kwc { color: #30a188; } .kwd { color: #990000; } knitr/inst/themes/oxygenated.css0000644000175100001440000000055112235534376016555 0ustar hornikusers.background { color: #0f0f0f; } .num { color: #0099CC; } .str { color: #FFCC00; font-weight: bold; } .com { color: #00CC33; } .opt { color: #ff0099; font-weight: bold; } .std { color: #FFFF66; font-weight: bold; } .kwa { color: #99aaff; font-weight: bold; } .kwb { color: #66ff99; } .kwc { color: #ff99ff; } .kwd { color: #33ddee; } knitr/inst/themes/acid.css0000644000175100001440000000055112235534377015307 0ustar hornikusers.background { color: #eeeeee; } .num { color: #800080; font-weight: bold; } .str { color: #a68500; } .com { color: #ff8000; } .opt { color: #ff0080; font-weight: bold; } .std { color: #000000; } .kwa { color: #bb7977; font-weight: bold; } .kwb { color: #8080c0; font-weight: bold; } .kwc { color: #0080c0; } .kwd { color: #004466; } knitr/inst/themes/lucretia.css0000644000175100001440000000042512235534376016216 0ustar hornikusers.background { color: #001C42; } .num { color: #63759C; } .str { color: #E7F3B5; } .com { color: #944D39; } .opt { color: #6A7969; } .std { color: #de9d7c; } .kwa { color: #907fd4; } .kwb { color: #29a655; } .kwc { color: #427142; } .kwd { color: #A59A39; } knitr/inst/themes/ekvoli.css0000644000175100001440000000055412235534374015700 0ustar hornikusers.background { color: #001535; } .num { color: #87c6f0; font-style: italic; } .str { color: #87c6f0; font-style: italic; } .com { color: #9590d5; font-style: italic; } .opt { color: #dedede; } .std { color: #dedede; } .kwa { color: #ffffff; font-weight: bold; } .kwb { color: #90bfd0; } .kwc { color: #9fd190; } .kwd { color: #d1909e; } knitr/inst/themes/neon.css0000644000175100001440000000042512235534377015346 0ustar hornikusers.background { color: #303030; } .num { color: #92d4ff; } .str { color: #92d4ff; } .com { color: #c0c0c0; } .opt { color: #f0f0f0; } .std { color: #f0f0f0; } .kwa { color: #dcdc78; } .kwb { color: #60f0a8; } .kwc { color: #7979db; } .kwd { color: #db79aa; } knitr/inst/themes/moe.css0000644000175100001440000000052412235534375015165 0ustar hornikusers.background { color: #f6f6f6; } .num { color: #880022; } .str { color: #aa4400; } .com { color: #ff8800; } .opt { color: #000000; font-weight: bold; } .std { color: #000000; } .kwa { color: #661111; font-weight: bold; } .kwb { color: #000066; font-weight: bold; } .kwc { color: #000066; } .kwd { color: #004466; } knitr/inst/themes/freya.css0000644000175100001440000000047712235534376015523 0ustar hornikusers.background { color: #2a2a2a; } .num { color: #afe091; } .str { color: #afe091; } .com { color: #c2b680; } .opt { color: #dcdccc; } .std { color: #dcdccc; } .kwa { color: #e0af91; font-weight: bold; } .kwb { color: #dabfa5; font-weight: bold; } .kwc { color: #d792e0; } .kwd { color: #a6e1ff; } knitr/inst/themes/pablo.css0000644000175100001440000000052412235534374015501 0ustar hornikusers.background { color: #000000; } .num { color: #00ffff; } .str { color: #00ffff; } .com { color: #808080; } .opt { color: #ff0000; } .std { color: #ffffff; } .kwa { color: #c0c000; font-weight: bold; } .kwb { color: #00c000; font-weight: bold; } .kwc { color: #3939bf; font-weight: bold; } .kwd { color: #21ffc0; } knitr/inst/themes/navajo-night.css0000644000175100001440000000055112235534374016771 0ustar hornikusers.background { color: #35536f; } .num { color: #3fffa7; } .str { color: #3fffa7; } .com { color: #e7e77f; } .opt { color: #ffffff; } .std { color: #ffffff; } .kwa { color: #5ad5d5; font-weight: bold; } .kwb { color: #d174a8; font-weight: bold; } .kwc { color: #98d65a; font-weight: bold; } .kwd { color: #ffffff; font-weight: bold; } knitr/inst/themes/dante.css0000644000175100001440000000042512235534374015477 0ustar hornikusers.background { color: #000000; } .num { color: #ee0000; } .str { color: #cd2626; } .com { color: #008b8b; } .opt { color: #cdaf96; } .std { color: #cdaf96; } .kwa { color: #cdad00; } .kwb { color: #66cd00; } .kwc { color: #cc0085; } .kwd { color: #cccccc; } knitr/inst/themes/darkslategray.css0000644000175100001440000000047712235534376017252 0ustar hornikusers.background { color: #2f4f4f; } .num { color: #ff6347; } .str { color: #7fffd4; } .com { color: #da70d6; } .opt { color: #f5deb3; } .std { color: #f5deb3; } .kwa { color: #4682b4; font-weight: bold; } .kwb { color: #98fb98; font-weight: bold; } .kwc { color: #b57847; } .kwd { color: #b3caf5; } knitr/inst/themes/bipolar.css0000644000175100001440000000057712235534377016047 0ustar hornikusers.background { color: #0f020a; } .num { color: #0083c9; } .str { color: #eba236; } .com { color: #35d6e5; font-style: italic; } .opt { color: #e3d922; } .std { color: #d62b9a; } .kwa { color: #20c79d; font-weight: bold; } .kwb { color: #1d9617; font-weight: bold; } .kwc { color: #72d42c; font-weight: bold; } .kwd { color: #81e535; font-weight: bold; } knitr/inst/themes/tcsoft.css0000644000175100001440000000050012235534375015701 0ustar hornikusers.background { color: #FFFFFF; } .num { color: #666666; } .str { color: #666666; } .com { color: #000099; font-style: italic; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #FF9900; } .kwb { color: #FF9900; font-weight: bold; } .kwc { color: #0066ff; } .kwd { color: #ff00e5; } knitr/inst/themes/olive.css0000644000175100001440000000045212235534376015524 0ustar hornikusers.background { color: #333300; } .num { color: #ffddad; } .str { color: #afff2f; } .com { color: #bdb66b; } .opt { color: #D9D9C3; } .std { color: #D9D9C3; } .kwa { color: #8fbc8f; font-weight: bold; } .kwb { color: #daa520; } .kwc { color: #21d948; } .kwd { color: #D9D9C3; } knitr/inst/themes/xoria256.css0000644000175100001440000000042512235534400015751 0ustar hornikusers.background { color: #1c1c1c; } .num { color: #dfaf87; } .str { color: #ffffaf; } .com { color: #808080; } .opt { color: #d0d0d0; } .std { color: #d0d0d0; } .kwa { color: #87afdf; } .kwb { color: #87de8c; } .kwc { color: #deb787; } .kwd { color: #de87da; } knitr/inst/themes/manxome.css0000644000175100001440000000042512235534377016053 0ustar hornikusers.background { color: #000000; } .num { color: #00ffff; } .str { color: #00ffff; } .com { color: #00ff00; } .opt { color: #ffff00; } .std { color: #cccccc; } .kwa { color: #00aaaa; } .kwb { color: #f70000; } .kwc { color: #5500ab; } .kwd { color: #00aaaa; } knitr/inst/themes/fruit.css0000644000175100001440000000042512235534375015536 0ustar hornikusers.background { color: #f8f8f8; } .num { color: #8016ff; } .str { color: #ff6633; } .com { color: #ff4080; } .opt { color: #404040; } .std { color: #404040; } .kwa { color: #f030d0; } .kwb { color: #0070e6; } .kwc { color: #30f050; } .kwd { color: #b030f0; } knitr/inst/themes/bluegreen.css0000644000175100001440000000052512235534400016343 0ustar hornikusers.background { color: #061A3E; } .num { color: #72A5E4; font-weight: bold; } .str { color: #72A5E4; font-weight: bold; } .com { color: #DABEA2; font-style: italic; } .opt { color: #ffffff; } .std { color: #ffffff; } .kwa { color: #7E75B5; } .kwb { color: #A9EE8A; } .kwc { color: #b5768d; } .kwd { color: #76b57e; } knitr/inst/themes/clarity.css0000644000175100001440000000042512235534400016041 0ustar hornikusers.background { color: #1F3055; } .num { color: #b3ee3a; } .str { color: #cccccc; } .com { color: #9e9e9e; } .opt { color: #b2dfee; } .std { color: #b2dfee; } .kwa { color: #cd919e; } .kwb { color: #ff4400; } .kwc { color: #9ecc91; } .kwd { color: #edc1b2; } knitr/inst/themes/leo.css0000644000175100001440000000045312235534376015166 0ustar hornikusers.background { color: #000000; } .num { color: #ff875f; } .str { color: #ffd7d7; } .com { color: #a8a8a8; font-style: italic; } .opt { color: #ffffff; } .std { color: #ffffff; } .kwa { color: #00d700; } .kwb { color: #5fafff; } .kwc { color: #006bd6; } .kwd { color: #d600d6; } knitr/inst/themes/camo.css0000644000175100001440000000042512235534376015325 0ustar hornikusers.background { color: #232323; } .num { color: #d2691e; } .str { color: #ffe4b5; } .com { color: #d2b48c; } .opt { color: #ffe4c4; } .std { color: #ffe4c4; } .kwa { color: #f0e68c; } .kwb { color: #cdc673; } .kwc { color: #c7f08b; } .kwd { color: #ffc7c4; } knitr/inst/themes/denim.css0000644000175100001440000000042512235534375015501 0ustar hornikusers.background { color: #000038; } .num { color: #33FF33; } .str { color: #CCCC99; } .com { color: #999999; } .opt { color: #FFFFFF; } .std { color: #FFFFFF; } .kwa { color: #FFFFCC; } .kwb { color: #33FF99; } .kwc { color: #33FF99; } .kwd { color: #9966cc; } knitr/inst/themes/molokai.css0000644000175100001440000000045212235534377016042 0ustar hornikusers.background { color: #272822; } .num { color: #AE81FF; } .str { color: #E6DB74; } .com { color: #75715E; } .opt { color: #F8F8F2; } .std { color: #F8F8F2; } .kwa { color: #F92672; font-weight: bold; } .kwb { color: #66D9EF; } .kwc { color: #95f067; } .kwd { color: #25faac; } knitr/inst/themes/edit-anjuta.css0000644000175100001440000000050012235534375016604 0ustar hornikusers.background { color: #ffffff; } .num { color: #008800; } .str { color: #ddbb00; } .com { color: #ff0000; font-style: italic; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #000080; font-weight: bold; } .kwb { color: #000080; } .kwc { color: #0000ff; } .kwd { color: #000000; } knitr/inst/themes/nuvola.css0000644000175100001440000000045212235534400015676 0ustar hornikusers.background { color: #F9F5F9; } .num { color: #00C226; } .str { color: #B91F49; } .com { color: #3F6B5B; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #F06F00; } .kwb { color: #0000ff; } .kwc { color: #08f000; font-weight: bold; } .kwd { color: #e800f0; } knitr/inst/themes/vampire.css0000644000175100001440000000052512235534375016051 0ustar hornikusers.background { color: #000000; } .num { color: #aaff00; } .str { color: #bb00ff; } .com { color: #ababab; font-style: italic; } .opt { color: #F3E651; } .std { color: #ff0000; } .kwa { color: #ffffff; font-weight: bold; } .kwb { color: #F35E1E; font-weight: bold; } .kwc { color: #ffffff; } .kwd { color: #ffcc33; } knitr/inst/themes/zmrok.css0000644000175100001440000000045212235534374015546 0ustar hornikusers.background { color: #141414; } .num { color: #FACE43; } .str { color: #D9FF77; } .com { color: #888888; } .opt { color: #F8F8F8; } .std { color: #F8F8F8; } .kwa { color: #A56A30; font-weight: bold; } .kwb { color: #C7CA87; } .kwc { color: #30a630; } .kwd { color: #3b84cc; } knitr/inst/themes/peaksea.css0000644000175100001440000000042512235534400016003 0ustar hornikusers.background { color: #e0e0e0; } .num { color: #907000; } .str { color: #007068; } .com { color: #606000; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #2060a8; } .kwb { color: #0850a0; } .kwc { color: #a86920; } .kwd { color: #20a825; } knitr/inst/themes/default.css0000644000175100001440000000052512235534375016032 0ustar hornikusers.background { color: #F5F5F5; } .num { color: #AF0F91; } .str { color: #317ECC; } .com { color: #AD95AF; font-style: italic; } .opt { color: #000000; } .std { color: #585858; } .kwa { color: #295F94; font-weight: bold; } .kwb { color: #B05A65; } .kwc { color: #55aa55; } .kwd { color: #BC5A65; font-weight: bold; } knitr/inst/themes/easter.css0000644000175100001440000000055212235534377015673 0ustar hornikusers.background { color: #fff9b9; } .num { color: #e11a70; } .str { color: #ca4be3; } .com { color: #1ea411; font-style: italic; } .opt { color: #fa4700; } .std { color: #2C7B34; } .kwa { color: #1d45d6; font-weight: bold; } .kwb { color: #ed0f55; font-weight: bold; } .kwc { color: #26aae7; font-weight: bold; } .kwd { color: #1d45d6; } knitr/inst/themes/kellys.css0000644000175100001440000000045212235534374015707 0ustar hornikusers.background { color: #2a2b2f; } .num { color: #d1c79e; } .str { color: #d1c79e; } .com { color: #67686b; } .opt { color: #e1e0e5; } .std { color: #e1e0e5; } .kwa { color: #62acce; font-weight: bold; } .kwb { color: #e6ac32; } .kwc { color: #cf8563; } .kwd { color: #bb63cf; } knitr/inst/themes/zenburn.css0000644000175100001440000000052512235534377016073 0ustar hornikusers.background { color: #1f1f1f; } .num { color: #dca3a3; font-weight: bold; } .str { color: #cc9393; } .com { color: #7f9f7f; font-style: italic; } .opt { color: #dcdccc; } .std { color: #dcdccc; } .kwa { color: #e3ceab; } .kwb { color: #dfdfbf; font-weight: bold; } .kwc { color: #aae3b2; } .kwd { color: #aabfe3; } knitr/inst/themes/relaxedgreen.css0000644000175100001440000000042512235534375017052 0ustar hornikusers.background { color: #000000; } .num { color: #0099dd; } .str { color: #0099dd; } .com { color: #00a594; } .opt { color: #aaaaaa; } .std { color: #aaaaaa; } .kwa { color: #ac0000; } .kwb { color: #559955; } .kwc { color: #00abab; } .kwd { color: #ededed; } knitr/inst/themes/anotherdark.css0000644000175100001440000000042512235534400016674 0ustar hornikusers.background { color: #323232; } .num { color: #ffa0a0; } .str { color: #ffa0a0; } .com { color: #ffa500; } .opt { color: #dedede; } .std { color: #dedede; } .kwa { color: #f0e68c; } .kwb { color: #bdb66b; } .kwc { color: #8b95f0; } .kwd { color: #f25252; } knitr/inst/themes/edit-msvs2008.css0000644000175100001440000000042512235534375016632 0ustar hornikusers.background { color: #ffffff; } .num { color: #000000; } .str { color: #a31515; } .com { color: #008000; } .opt { color: #000000; } .std { color: #000000; } .kwa { color: #0000ff; } .kwb { color: #0000ff; } .kwc { color: #2b91af; } .kwd { color: #000000; } knitr/tests/0000755000175100001440000000000012304672772012573 5ustar hornikusersknitr/tests/testit/0000755000175100001440000000000013136172740014101 5ustar hornikusersknitr/tests/testit/test-patterns.R0000644000175100001440000000165013142522202017030 0ustar hornikuserslibrary(testit) assert( 'detect_pattern() automatically detects syntax patterns', identical(detect_pattern('<<>>='), 'rnw'), identical(detect_pattern('<>='), 'rnw'), identical(detect_pattern('% begin.rcode'), 'tex'), identical(detect_pattern('', all_patterns$html)$code, ' "" ') ) res = parse_inline('inline expressions `r pi+1`, +r cos(0)+ in AsciiDoc', all_patterns$asciidoc) assert( 'both `r expression` and +r expression+ work for AsciiDoc', identical(res$code, c('pi+1', 'cos(0)')) ) knit_code$restore() read_chunk(lines = c('1+1')) assert( 'read_chunk() does not discard code without chunk headers', identical(knit_code$get(), list('unnamed-chunk-1' = '1+1')) ) knit_code$restore() read_chunk(lines = c('# ---- foo ----', '1+1')) assert( 'read_chunk() can identify chunk labels', identical(knit_code$get(), list(foo = '1+1')) ) knit_code$restore() # chunk references with <<>> -------------------------------------------------- knit_code$restore(list( a = '1+1', b = '2-2', c = c('if (T)', ' <>'), d = c('function() {', ' <>', '}') )) pc = function(x) parse_chunk(x, all_patterns$rnw$ref.chunk) assert( 'parse_chunk() preserves indentation', identical(pc(c('3*3', '<>', ' <>', 'if (T)', ' <>')), c("3*3", "1+1", " 2-2", "if (T)", " 1+1" )), identical(pc('<>'), "function() {\n if (T)\n 1+1\n}") ) knit_code$restore() knitr/tests/testit/test-sql.R0000644000175100001440000000222613142522202015767 0ustar hornikuserslibrary(testit) assert( !is_sql_update_query('SELECT 1'), !is_sql_update_query('SELECT * FROM foo'), !is_sql_update_query(' SELECT 1'), !is_sql_update_query('\nSELECT 1'), !is_sql_update_query('\tSELECT 1') ) assert(!is_sql_update_query(c('-- Some SQL', 'SELECT 1'))) assert(!is_sql_update_query(c('/* ', ' Some SQL', '*/', 'SELECT 1'))) assert(!is_sql_update_query(c(' /* ', ' Some SQL', ' */', 'SELECT 1'))) assert(is_sql_update_query('UPDATE foo SET a=1')) assert(is_sql_update_query(' UPDATE foo SET a=1')) assert(is_sql_update_query('\n\nUPDATE foo SET a=1')) assert(is_sql_update_query('\tUPDATE foo SET a=1')) assert(is_sql_update_query('DELETE FROM foo')) assert(is_sql_update_query('INSERT INTO foo values(1)')) assert(is_sql_update_query(c('-- SELECT 1', 'INSERT INTO foo values(1)'))) assert(is_sql_update_query(c('/*SELECT 1*/', ' INSERT INTO foo values(1)'))) assert(is_sql_update_query(c( '/*', ' Insert records into table', '*/', '', ' INSERT INTO foo values(1)' ))) assert(is_sql_update_query('update foo set a=1')) assert(is_sql_update_query('delete from foo')) assert(is_sql_update_query('insert into foo values(1)')) knitr/tests/testit/test-table.R0000644000175100001440000001120013142522202016247 0ustar hornikuserslibrary(testit) kable2 = function(...) as.character(kable(...)) assert( 'kable() works on data frames/matrices of one row', kable(data.frame(x = 1, y = 1), format = 'markdown') == c('| x| y|', '|--:|--:|', '| 1| 1|') ) m = matrix(1:2, nrow = 1, dimnames = list('a', c('x', 'y'))) assert( 'kable() does not discard row names when there is only one row', identical(kable2(m), c('| | x| y|', '|:--|--:|--:|', '|a | 1| 2|')) ) assert( 'kable() recycles the align argument correctly', identical(kable2(m, align = 'c'), c('| | x | y |', '|:--|:-:|:-:|', '|a | 1 | 2 |')) ) assert( 'kable() align with strings correctly', identical(kable2(m, align = c('c', 'r')), kable2(m, align = 'cr')) ) assert( 'kable() works on character data frames', identical(kable2(data.frame(x = 'a')), c('|x |', '|:--|', '|a |')) ) assert( "kable() works on NA's", identical(kable2(data.frame(x = c(NA, FALSE))), c('|x |', '|:-----|', '|NA |', '|FALSE |')) ) assert( 'kable() does not add extra spaces to character columns', identical( kable2(data.frame(x = c(1.2, 4.87), y = c('fooooo', 'bar')), 'latex'), ' \\begin{tabular}{r|l} \\hline x & y\\\\ \\hline 1.20 & fooooo\\\\ \\hline 4.87 & bar\\\\ \\hline \\end{tabular}' ) ) assert( 'kable() escapes LaTeX special characters by default', identical( kable2(data.frame(x = c("10%", "5%"), col_name = c("3_8", "40_6")), 'latex'), ' \\begin{tabular}{l|l} \\hline x & col\\_name\\\\ \\hline 10\\% & 3\\_8\\\\ \\hline 5\\% & 40\\_6\\\\ \\hline \\end{tabular}' ) ) assert( 'kable() doesn\'t escape LaTeX special characters when escape = FALSE', identical( kable2(data.frame(x = c("10%", "5%"), col_name = c("3_8", "40_6")), 'latex', escape = FALSE), ' \\begin{tabular}{l|l} \\hline x & col_name\\\\ \\hline 10% & 3_8\\\\ \\hline 5% & 40_6\\\\ \\hline \\end{tabular}' ) ) assert( 'kable() escapes HTML special characters by default', identical( kable2(data.frame(x = c("10<>", "5&2"), "y" = c("3>8", "\"40\"")), 'html'), "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n\n
x y
10<> 3>8
5&2 "40"
" ) ) assert( 'kable() doesn\'t escape HTML special characters when escape = FALSE', identical( kable2(data.frame(x = c("10<>", "5&2"), "y" = c("3>8", "\"40\"")), 'html', escape = FALSE), "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n\n
x y
10<> 3>8
5&2 \"40\"
" ) ) assert( 'kable(digits = vector) works on numeric matrices', identical( kable2(matrix(c(1.1, 1.2, 2.3, 2.4), 2, dimnames = list(NULL, c('a', 'b'))), digits = c(0, 1)), c('| a| b|', '|--:|---:|', '| 1| 2.3|', '| 1| 2.4|') ) ) assert( 'kable() works on matrices with duplicate row names', identical( kable2(matrix(c(1, 1, 1, 1), ncol = 2, dimnames = list(c('A', 'A'), c('B', 'B')))), c('| | B| B|', '|:--|--:|--:|', '|A | 1| 1|', '|A | 1| 1|') ) ) assert( 'kable() works on matrices with NA colname', identical( kable2(matrix(c(1, 1, 1, 1), ncol = 2, dimnames = list(c('A', NA), c('B', NA)))), c("| | B| NA|", "|:--|--:|--:|", "|A | 1| 1|", "|NA | 1| 1|") ) ) # edge cases (should not error) x1 = matrix(NA, 0, 0) x2 = matrix(NA, 0, 1) x3 = matrix(NA, 1, 0) for (f in c('pandoc', 'html', 'latex', 'rst')) { kable(x1, f) kable(x2, f) kable(x3, f) } colnames(x2) = 'a' assert( 'kable(, "markdown") works for a 0 zero 1 column matrix', identical(kable2(x2, 'markdown'), c('|a |', '|:--|')) ) assert( 'kable() works on an irregular matrix', identical( kable2(matrix(list('a', 2, 3, 4), nrow = 2), col.names = c('a', 'b')), c('|a |b |', '|:--|:--|', '|a |3 |', '|2 |4 |') ) ) assert( 'has_rownames() works', !has_rownames(matrix(1:4, 2)), !has_rownames(iris), has_rownames(mtcars), !has_rownames(as.data.frame(matrix(nrow = 0, ncol = 3))) ) op = options(knitr.kable.NA = '') assert( 'kable() can display NA as emtpy strings', kable2(matrix(c(1, NA, 3, 4), nrow = 2), col.names = c('a', 'b')) %==% c('| a| b|', '|--:|--:|', '| 1| 3|', '| | 4|') ) options(op) knitr/tests/run-all.R0000644000175100001440000000004213142522202014243 0ustar hornikuserslibrary(testit) test_pkg("knitr") knitr/NAMESPACE0000644000175100001440000000526513071066354012653 0ustar hornikusers# Generated by roxygen2: do not edit by hand S3method("$",knitr_strict_list) S3method(knit_print,default) S3method(knit_print,knit_asis) S3method(knit_print,knitr_kable) S3method(print,knitr_kable) S3method(process_group,block) S3method(process_group,inline) S3method(process_tangle,block) S3method(process_tangle,inline) S3method(wrap,character) S3method(wrap,default) S3method(wrap,error) S3method(wrap,html_screenshot) S3method(wrap,knit_asis) S3method(wrap,knit_embed_url) S3method(wrap,knit_image_paths) S3method(wrap,list) S3method(wrap,message) S3method(wrap,recordedplot) S3method(wrap,source) S3method(wrap,warning) export(Sweave2knitr) export(all_labels) export(all_patterns) export(all_rcpp_labels) export(asis_output) export(clean_cache) export(combine_words) export(current_input) export(dep_auto) export(dep_prev) export(engine_output) export(extract_raw_output) export(fig_chunk) export(fig_path) export(hook_ffmpeg_html) export(hook_movecode) export(hook_optipng) export(hook_pdfcrop) export(hook_plot_asciidoc) export(hook_plot_custom) export(hook_plot_html) export(hook_plot_md) export(hook_plot_rst) export(hook_plot_tex) export(hook_plot_textile) export(hook_pngquant) export(hook_purl) export(hook_r2swf) export(hook_scianimator) export(image_uri) export(imgur_upload) export(include_app) export(include_graphics) export(include_url) export(inline_expr) export(kable) export(knit) export(knit2html) export(knit2pandoc) export(knit2pdf) export(knit2wp) export(knit_child) export(knit_engines) export(knit_exit) export(knit_expand) export(knit_filter) export(knit_global) export(knit_hooks) export(knit_meta) export(knit_meta_add) export(knit_params) export(knit_params_yaml) export(knit_patterns) export(knit_print) export(knit_rd) export(knit_rd_all) export(knit_theme) export(knit_watch) export(load_cache) export(normal_print) export(opts_chunk) export(opts_current) export(opts_hooks) export(opts_knit) export(opts_template) export(pandoc) export(pat_asciidoc) export(pat_brew) export(pat_html) export(pat_md) export(pat_rnw) export(pat_rst) export(pat_tex) export(pat_textile) export(plot_crop) export(purl) export(rand_seed) export(raw_output) export(read_chunk) export(read_demo) export(read_rforge) export(render_asciidoc) export(render_html) export(render_jekyll) export(render_latex) export(render_listings) export(render_markdown) export(render_rst) export(render_sweave) export(render_textile) export(restore_raw_output) export(rocco) export(rst2pdf) export(set_alias) export(set_header) export(set_parent) export(spin) export(spin_child) export(stitch) export(stitch_rhtml) export(stitch_rmd) export(wrap_rmd) export(write_bib) import(grDevices) import(graphics) import(methods) import(stats) import(utils) knitr/demo/0000755000175100001440000000000012741516422012347 5ustar hornikusersknitr/demo/gwidgets.R0000644000175100001440000000030413142522202014271 0ustar hornikusers# for installation, see https://github.com/jverzani/gWidgetsWWW2 library(gWidgetsWWW2) options(device.ask.default = FALSE) load_app(system.file('misc', 'gWidgetsWWW2-knitr.R', package = 'knitr')) knitr/demo/notebook.R0000644000175100001440000000017013142522202014275 0ustar hornikusers# for installation, see https://github.com/rstudio/shiny library(shiny) runApp(system.file('shiny', package = 'knitr')) knitr/demo/00Index0000644000175100001440000000013512235534604013500 0ustar hornikusersnotebook An R Notebook based on Shiny gwidgets An R Notebook based on gWidgetsWWW2 knitr/R/0000755000175100001440000000000013142505112011612 5ustar hornikusersknitr/R/hooks-html.R0000644000175100001440000001613213142522202014024 0ustar hornikusers#' @rdname hook_plot #' @export hook_plot_html = function(x, options) { # pull out all the relevant plot options fig.num = options$fig.num = options$fig.num %n% 1L fig.cur = options$fig.cur %n% 1L if (options$fig.show == 'animate') { # Don't print out intermediate plots if we're animating return(if (fig.cur < fig.num) '' else opts_knit$get('animation.fun')(x, options)) } ai = options$fig.show == 'asis' plot1 = ai || fig.cur <= 1L; plot2 = ai || fig.cur == fig.num d1 = if (plot1) paste0(if (out_format('html')) '', sprintf('
', options$fig.align)) d2 = if (plot2) paste0('
', if (out_format('html')) '
') paste0( d1, .img.tag( .upload.url(x), options$out.width, options$out.height, .img.cap(options), paste(c(options$out.extra, 'class="plot"'), collapse = ' ') ), d2, '\n' ) } .img.attr = function(w, h, extra) { paste(c(sprintf('width="%s"', w), sprintf('height="%s"', h), extra), collapse = ' ') } .img.tag = function(src, w, h, caption, extra) { caption = if (length(caption) == 1 && caption != '') { paste0('title="', caption, '" alt="', caption, '" ') } tag = if (grepl('[.]pdf$', src, ignore.case = TRUE)) { extra = c(extra, 'type="application/pdf"') 'embed' } else 'img' paste0( '<', tag, ' src="', opts_knit$get('base.url'), src, '" ', caption, .img.attr(w, h, extra), ' />' ) } .img.cap = function(options, alt = FALSE) { cap = options$fig.cap %n% { if (is.null(pandoc_to())) sprintf('plot of chunk %s', options$label) else '' } if (length(cap) == 0) cap = '' if (is_blank(cap)) return(cap) if (alt) return(escape_html(cap)) paste0(create_label(options$fig.lp, options$label), cap) } # a wrapper to upload an image and return the URL .upload.url = function(x) { opts_knit$get('upload.fun')(x) } .chunk.hook.html = function(x, options) { if (output_asis(x, options)) return(x) x = sprintf('
%s
', options$label, x) x = gsub('
\\s*
', '', x) # rm empty rcode layers if (options$split) { name = fig_path('.html', options, NULL) if (!file.exists(dirname(name))) dir.create(dirname(name)) cat(x, file = name) sprintf('', name) } else x } #' Hooks to create animations in HTML output #' #' \code{hook_ffmpeg_html()} uses FFmpeg to convert images to a video; #' \code{hook_scianimator()} uses the JavaScript library SciAnimator to create #' animations; \code{hook_r2swf()} uses the \pkg{R2SWF} package. #' #' These hooks are mainly for the package option \code{animation.fun}, e.g. you #' can set \code{opts_knit$set(animation.fun = hook_scianimator)}. #' @inheritParams hook_plot_tex #' @rdname hook_animation #' @export hook_ffmpeg_html = function(x, options) { hook_ffmpeg(x, options, options$ffmpeg.format %n% 'webm') } hook_ffmpeg = function(x, options, format = 'webm') { x = c(sans_ext(x), file_ext(x)) fig.num = options$fig.num format = sub('^[.]', '', format) # set up the ffmpeg run base = sub(paste0(fig.num, '$'), '', x[1]) fig.fname = paste0(base, '%d', '.', x[2]) mov.fname = paste0(sub('-$', '', base), '.', format) extra = if (format == 'webm') { paste('-b:v', options$ffmpeg.bitrate %n% '1M', '-crf 10') } ffmpeg.cmd = paste( 'ffmpeg', '-y', '-r', 1 / options$interval, '-i', fig.fname, extra, mov.fname ) if (Sys.which('ffmpeg') == '') stop2( 'Could not find ffmpeg command. You should either change the animation.fun ', 'hook option or install ffmpeg with libvpx enabled.' ) message('executing: ', ffmpeg.cmd) system(ffmpeg.cmd, ignore.stdout = TRUE) # use a normal plot hook if the output is GIF if (format == 'gif') { options$fig.show = 'hold' return((if (out_format('markdown')) hook_plot_md else hook_plot_html)(mov.fname, options)) } # controls,loop --> controls loop opts = paste(sc_split(options$aniopts), collapse = ' ') opts = paste( sprintf('width="%s"', options$out.width), sprintf('height="%s"', options$out.height), opts ) cap = .img.cap(options, alt = TRUE) if (cap != '') cap = sprintf('

%s

', cap) sprintf( '', trimws(opts), paste0(opts_knit$get('base.url'), mov.fname), cap ) } # use SciAnimator to create animations #' @rdname hook_animation #' @export hook_scianimator = function(x, options) { x = c(sans_ext(x), file_ext(x)) fig.num = options$fig.num base = opts_knit$get('base.url') %n% '' # write the div and js code here id = gsub('[^[:alnum:]]', '_', options$label) sprintf('
', id, fig.num, base, sub(paste0(fig.num, '$'), '', x[1]), x[2], id, options$interval * 1000, id) } # use the R2SWF package to create Flash animations #' @rdname hook_animation #' @export hook_r2swf = function(x, options) { x = c(sans_ext(x), file_ext(x)) fig.num = options$fig.num # set up the R2SWF run fig.name = paste0(sub(paste0(fig.num, '$'), '', x[1]), 1:fig.num, '.', x[2]) swf.name = fig_path('.swf', options, NULL) w = options$out.width %n% (options$fig.width * options$dpi) h = options$out.height %n% (options$fig.height * options$dpi) swf2html = getFromNamespace('swf2html', 'R2SWF') file2swf = getFromNamespace('file2swf', 'R2SWF') swfhtml = swf2html(file2swf(files = fig.name, swf.name, interval = options$interval), output = FALSE, fragment = TRUE, width = w, height = h) if (options$fig.align == 'default') return(swfhtml) sprintf(paste('
\n', swfhtml, '\n
'), options$fig.align) } #' @rdname output_hooks #' @export render_html = function() { set_html_dev() opts_knit$set(out.format = 'html') # use div with different classes html.hook = function(name) { force(name) function(x, options) { x = if (name == 'source') { c(hilight_source(x, 'html', options), '') } else escape_html(x) x = paste(x, collapse = '\n') sprintf('
%s
\n', name, tolower(options$engine), x) } } h = opts_knit$get('header') if (!nzchar(h['highlight'])) set_header(highlight = .header.hi.html) z = list() for (i in c('source', 'warning', 'message', 'error')) z[[i]] = html.hook(i) knit_hooks$set(z) knit_hooks$set(inline = function(x) { sprintf(if (inherits(x, 'AsIs')) '%s' else '%s', .inline.hook(format_sci(x, 'html'))) }, output = html.hook('output'), plot = hook_plot_html, chunk = .chunk.hook.html) } knitr/R/defaults.R0000644000175100001440000002153013142525645013562 0ustar hornikusers#' @include utils.R new_defaults = function(value = list()) { defaults = value get = function(name, default = FALSE, drop = TRUE) { if (default) defaults = value # this is only a local version if (missing(name)) defaults else { if (drop && length(name) == 1) defaults[[name]] else { setNames(defaults[name], name) } } } set = function(...) { dots = list(...) if (length(dots) == 0) return() if (is.null(names(dots)) && length(dots) == 1 && is.list(dots[[1]])) if (length(dots <- dots[[1]]) == 0) return() defaults <<- merge(dots) invisible(NULL) } merge = function(values) merge_list(defaults, values) restore = function(target = value) defaults <<- target list(get = get, set = set, merge = merge, restore = restore) } #' Default and current chunk options #' #' Options for R code chunks. When running R code, the object \code{opts_chunk} #' (default options) is not modified by chunk headers (local chunk options are #' merged with default options), whereas \code{opts_current} (current options) #' changes with different chunk headers and it always reflects the options for #' the current chunk. #' #' Normally we set up the global options once in the first code chunk in a #' document using \code{opts_chunk$set()}, so that all \emph{latter} chunks will #' use these options. Note the global options set in one chunk will not affect #' the options in this chunk itself, and that is why we often need to set global #' options in a separate chunk. #' #' See \code{str(knitr::opts_chunk$get())} for a list of default chunk options. #' @references Usage: \url{https://yihui.name/knitr/objects/} #' #' A list of available options: #' \url{https://yihui.name/knitr/options/#chunk_options} #' @note \code{opts_current} is read-only in the sense that it does nothing if #' you call \code{opts_current$set()}; you can only query the options via #' \code{opts_current$get()}. #' @export #' @examples opts_chunk$get('prompt'); opts_chunk$get('fig.keep') opts_chunk = new_defaults(list( eval = TRUE, echo = TRUE, results = 'markup', tidy = FALSE, tidy.opts = NULL, collapse = FALSE, prompt = FALSE, comment = '##', highlight = TRUE, strip.white = TRUE, size = 'normalsize', background = '#F7F7F7', cache = FALSE, cache.path = 'cache/', cache.vars = NULL, cache.lazy = TRUE, dependson = NULL, autodep = FALSE, cache.rebuild = FALSE, fig.keep = 'high', fig.show = 'asis', fig.align = 'default', fig.path = 'figure/', dev = NULL, dev.args = NULL, dpi = 72, fig.ext = NULL, fig.width = 7, fig.height = 7, fig.env = 'figure', fig.cap = NULL, fig.scap = NULL, fig.lp = 'fig:', fig.subcap = NULL, fig.pos = '', out.width = NULL, out.height = NULL, out.extra = NULL, fig.retina = 1, external = TRUE, sanitize = FALSE, interval = 1, aniopts = 'controls,loop', warning = TRUE, error = TRUE, message = TRUE, render = NULL, ref.label = NULL, child = NULL, engine = 'R', split = FALSE, include = TRUE, purl = TRUE )) #' @rdname opts_chunk #' @export opts_current = new_defaults() #' @include plot.R # a list of options attributes for RStudio opts_chunk_attr = local({ opts = lapply(opts_chunk$get(), class) opts[opts == 'NULL'] = 'character' opts$results = list('markup', 'asis', 'hold', 'hide') opts$fig.show = list('asis', 'hold', 'animate', 'hide') opts$fig.keep = list('high', 'none', 'all', 'first', 'last') opts$fig.align = list('default', 'left', 'right', 'center') opts$fig.showtext = 'logical' # quartz_ devices are for OS X only opts$dev = names(auto_exts) if (Sys.info()[['sysname']] != 'Darwin') opts$dev = grep('^quartz_', opts$dev, value = TRUE, invert = TRUE) if (.Platform$OS.type != 'windows') opts$dev = setdiff(opts$dev, 'win.metafile') opts$dev = as.list(opts$dev) opts$fig.ext = as.list(unique(auto_exts)) opts$external = opts$sanitize = NULL # hide these two rare options opts$fig.process = 'function' opts$fig.asp = 'numeric' opts$R.options = 'list' opts$cache.comments = 'logical' opts }) #' Set aliases for chunk options #' #' We do not have to use the chunk option names given in \pkg{knitr}; we can set #' aliases for them. The aliases are a named character vector; the names are #' aliases and the elements in this vector are the real option names. #' @param ... named arguments (argument names are aliases, and argument values #' are real chunk options) #' @return NULL (\code{opts_knit$get('aliases')} is modified as the side effect) #' @export #' @examples set_alias(w = 'fig.width', h = 'fig.height') #' # then we can use options w and h in chunk headers instead of fig.width and fig.height set_alias = function(...) { opts_knit$set(aliases = c(...)) } #' Options for the knitr package #' #' Options including whether to use a progress bar when knitting a document, and #' the base directory of images, etc. #' #' Besides the standard usage (\code{opts_knit$set()}), we can also set package #' options prior to loading \code{knitr} or calling \code{knit()} using #' \code{\link{options}()} in base R. A global option \code{knitr.package.foo} #' in \code{options()} will be set as an option \code{foo} in \code{opts_knit}, #' i.e. global options in base R with the prefix \code{knitr.package.} #' correspond to options in \code{opts_knit}. This can be useful to set package #' options in \file{~/.Rprofile} without loading \pkg{knitr}. #' #' See \code{str(knitr::opts_knit$get())} for a list of default package options. #' @references Usage: \url{https://yihui.name/knitr/objects/} #' #' A list of available options: #' \url{https://yihui.name/knitr/options/#package_options} #' @export #' @examples opts_knit$get('verbose'); opts_knit$set(verbose = TRUE) # change it #' if (interactive()) { #' # for unnamed chunks, use 'fig' as the figure prefix #' opts_knit$set(unnamed.chunk.label='fig') #' knit('001-minimal.Rmd') # from https://github.com/yihui/knitr-examples #' } #' @include hooks-html.R opts_knit = new_defaults(list( progress = TRUE, verbose = FALSE, width = 75L, eval.after = 'fig.cap', base.dir = NULL, base.url = NULL, root.dir = NULL, child.path = '', upload.fun = identity, animation.fun = hook_ffmpeg_html, global.device = FALSE, global.par = FALSE, concordance = FALSE, documentation = 1L, self.contained = TRUE, unnamed.chunk.label = 'unnamed-chunk', highr.opts = NULL, # internal options; users should not touch them out.format = NULL, child = FALSE, parent = FALSE, tangle = FALSE, aliases = NULL, header = c(highlight = '', tikz = '', framed = ''), global.pars = NULL )) # tangle: whether I'm in tangle mode; child: whether I'm in child document mode; # parent: whether I need to add parent preamble to the child output # you may modify these options in options(knitr.package.foo) opts_knit_names = c( 'progress', 'verbose', 'width', 'upload.fun', 'animation.fun', 'global.device', 'eval.after', 'concordance', 'documentation', 'aliases', 'self.contained', 'unnamed.chunk.label' ) # adjust opts_chunk and opts_knit according to options(), e.g. # options(knitr.package.progress = FALSE) --> opts_knit$set(progress = FALSE), # and options(knitr.chunk.tidy) --> opts_chunk$set(tidy = TRUE); this makes it # possible to set options in ~/.Rprofile without loading knitr adjust_opts_knit = function() { # begin_hack: R CMD build does not evaluate .Rprofile, but I need a way to # modify opts_chunk just for myself if (nzchar(opts <- Sys.getenv('R_KNITR_OPTIONS'))) eval(parse_only(sprintf('base::options(%s)', opts)), envir = globalenv()) # end_hack opts = options() nms = names(opts) if (length(nms <- grep('^knitr[.]', nms, value = TRUE)) == 0) return() opts = opts[nms] # for backward compatibility i = grep('^knitr[.](package|chunk)[.]', nms, invert = TRUE) i = intersect(i, which(nms[i] %in% paste('knitr', opts_knit_names, sep = '.'))) if (length(i)) { nms.pkg = sub('^knitr.', 'knitr.package.', nms[i]) warning2( 'These options must be renamed (from left to right):\n', formatUL(sprintf('%s => %s', nms[i], nms.pkg)), immediate. = TRUE ) Sys.sleep(10) names(opts)[i] = nms[i] = nms.pkg } # strip off knitr.chunk from option names and set chunk options i = grep('^knitr[.]chunk[.]', nms) opts_chunk$set(setNames(opts[i], sub('^knitr[.]chunk[.]', '', nms[i]))) # similarly for knitr.package.options i = grep('^knitr[.]package[.]', nms) opts_knit$set(setNames(opts[i], sub('^knitr[.]package[.]', '', nms[i]))) } #' Template for creating reusable chunk options #' #' Creates a template binding a label to a set of chunk options. Every chunk #' that references the template label will have the specificed set of options #' applied to it. #' @export #' @examples opts_template$set(myfigures = list(fig.height = 4, fig.width = 4)) #' # later you can reuse these chunk options by 'opts.label', e.g. #' #' # <>= #' #' # the above is equivalent to <>= opts_template = new_defaults() knitr/R/utils.R0000644000175100001440000010604613142522202013103 0ustar hornikusers# copy objects in one environment to the other copy_env = function(from, to, keys = ls(envir = from, all.names = TRUE)) { if (identical(from, to)) return() for (i in keys) assign(i, get(i, envir = from, inherits = FALSE), envir = to) } knit_counter = function(init = 0L) { n = init function(reset = FALSE) { if (reset) return(n <<- init) n <<- n + 1L n - 1L } } plot_counter = knit_counter(1L) shot_counter = knit_counter(1L) chunk_counter = knit_counter(1L) # a vectorized and better version than evaluate:::line_prompt line_prompt = function(x, prompt = getOption('prompt'), continue = getOption('continue')) { # match a \n, then followed by any character (use zero width assertion) paste0(prompt, gsub('(?<=\n)(?=.|\n)', continue, x, perl = TRUE)) } # add a prefix to output comment_out = function(x, prefix = '##', which = TRUE, newline = TRUE) { x = gsub('[\n]{2,}$', '\n', x) if (newline) x = gsub('([^\n])$', '\\1\n', x) # add \n if not exists if (is.null(prefix) || !nzchar(prefix) || is.na(prefix)) return(x) prefix = paste(prefix, '') x = gsub(' +([\n]*)$', '\\1', x) x[which] = line_prompt(x[which], prompt = prefix, continue = prefix) x } # assign string in comments to a global variable comment_to_var = function(x, varname, pattern, envir) { if (grepl(pattern, x)) { assign(varname, sub(pattern, '', x), envir = envir) return(TRUE) } FALSE } is_blank = function(x) { if (length(x)) all(grepl('^\\s*$', x)) else TRUE } valid_path = function(prefix, label) { if (length(prefix) == 0L || is.na(prefix) || prefix == 'NA') prefix = '' paste0(prefix, label) } # define a color variable in TeX color_def = function(col, variable = 'shadecolor') { if (is.na(col)) return('') # no LaTeX code when color is NA x = if (length(col) == 1L) sc_split(col) else col if ((n <- length(x)) != 3L) { if (n == 1L) x = drop(col2rgb(x) / 255) else { x = switch(variable, shadecolor = rep(.97, 3), fgcolor = rep(0, 3)) warning("the color '", col, "' is invalid;", 'using default color...', 'see https://yihui.name/knitr/options') } } if (length(x) != 3L) stop('invalid color:', col) if (is.numeric(x)) x = round(x, 3L) outdec = options(OutDec = '.'); on.exit(options(outdec)) sprintf('\\definecolor{%s}{rgb}{%s, %s, %s}', variable, x[1], x[2], x[3]) } # split by semicolon or colon sc_split = function(string) { if (is.call(string)) string = eval(string) if (is.numeric(string) || length(string) != 1L) return(string) stringr::str_trim(stringr::str_split(string, ';|,')[[1]]) } # extract LaTeX packages for tikzDevice set_preamble = function(input, patterns = knit_patterns$get()) { if (!out_format('latex')) return() .knitEnv$tikzPackages = .knitEnv$bibliography = NULL if (length(db <- patterns$document.begin) != 1L) return() # no \begin{document} pattern if (length(hb <- patterns$header.begin) != 1L) return() # no \documentclass{} pattern idx2 = grep(db, input)[1] if (is.na(idx2) || idx2 < 2L) return() idx1 = grep(hb, input)[1] if (is.na(idx1) || idx1 >= idx2) return() txt = paste(input[idx1:(idx2 - 1L)], collapse = '\n') # rough preamble idx = stringr::str_locate(txt, hb) # locate documentclass options(tikzDocumentDeclaration = stringr::str_sub(txt, idx[, 1L], idx[, 2L])) preamble = pure_preamble(split_lines(stringr::str_sub(txt, idx[, 2L] + 1L)), patterns) .knitEnv$tikzPackages = c(.header.sweave.cmd, preamble, '\n') .knitEnv$bibliography = grep('^\\\\bibliography.+', input, value = TRUE) } # filter out code chunks from preamble if they exist (they do in LyX/Sweave) pure_preamble = function(preamble, patterns) { res = split_file(lines = preamble, set.preamble = FALSE, patterns) # should avoid recursion if (!parent_mode()) { # when not in parent mode, just return normal texts and skip code return(unlist(res)) } owd = setwd(input_dir()); on.exit(setwd(owd)) progress = opts_knit$get('progress') # suppress printing of blocks and texts opts_knit$set(progress = FALSE); on.exit(opts_knit$set(progress = progress), add = TRUE) # run the code in the preamble sapply(res, if (opts_knit$get('tangle')) process_tangle else process_group) } #' Specify the parent document of child documents #' #' This function extracts the LaTeX preamble of the parent document to use for #' the child document, so that the child document can be compiled as an #' individual document. #' #' When the preamble of the parent document also contains code chunks and inline #' R code, they will be evaluated as if they were in this child document. For #' examples, when \pkg{knitr} hooks or other options are set in the preamble of #' the parent document, it will apply to the child document as well. #' @param parent path to the parent document (relative to the current child #' document) #' @return The preamble is extracted and stored to be used later when the #' complete output is written. #' @note Obviously this function is only useful when the output format is LaTeX. #' This function only works when the child document is compiled in a #' standalone mode using \code{\link{knit}()} (instead of being called in #' \code{\link{knit_child}()}); when the parent document is compiled, this #' function in the child document will be ignored. #' @references \url{https://yihui.name/knitr/demo/child/} #' @export #' @examples ## can use, e.g. \Sexpr{set_parent('parent_doc.Rnw')} or #' #' # <>= #' #' # set_parent('parent_doc.Rnw') #' #' # @@ set_parent = function(parent) { if (child_mode()) return(invisible(NULL)) # quit if in child mode opts_knit$set(parent = TRUE) set_preamble(readLines(parent, warn = FALSE)) invisible(NULL) } # whether to write results as-is? output_asis = function(x, options) { is_blank(x) || options$results == 'asis' } # path relative to dir of the input file input_dir = function(ignore_root = FALSE) { root = opts_knit$get('root.dir') # LyX is a special case: the input file is in tempdir, and we should use # root.dir as the real input dir (#809) if (is_lyx()) return(root) if (ignore_root) { .knitEnv$input.dir %n% '.' } else { root %n% (if (!getOption('knitr.use.cwd', FALSE)) .knitEnv$input.dir) %n% '.' } } is_lyx = function() { args = commandArgs(TRUE) if (length(args) < 4) return(FALSE) grepl('[.]Rnw$', args[1]) && !is.na(Sys.getenv('LyXDir', NA)) } # round a number to getOption('digits') decimal places by default, and format() # it using significant digits if the option knitr.digits.signif = TRUE round_digits = function(x) { if (getOption('knitr.digits.signif', FALSE)) format(x) else { as.character(round(x, getOption('digits'))) } } # scientific notation in TeX, HTML and reST format_sci_one = function(x, format = 'latex') { if (!(class(x)[1] == 'numeric') || is.na(x) || x == 0) return(as.character(x)) if (is.infinite(x)) { return( switch(format, latex = { sprintf("%s\\infty{}", ifelse(x < 0, "-", "")) }, html = { sprintf("%s∞", ifelse(x < 0, "-", "")) }, as.character(x))) } if (abs(lx <- floor(log10(abs(x)))) < getOption('scipen') + 4L) return(round_digits(x)) # no need sci notation b = round_digits(x / 10^lx) b[b %in% c(1, -1)] = '' switch(format, latex = { sci_notation('%s%s10^{%s}', b, '\\times ', lx) }, html = sci_notation('%s%s10%s', b, ' × ', lx), md = sci_notation('%s%s10^%s^', b, '× ', lx), rst = { # if AsIs, use the :math: directive if (inherits(x, 'AsIs')) { s = sci_notation('%s%s10^{%s}', b, '\\times ', lx) sprintf(':math:`%s`', s) } else { # This needs the following line at the top of the file to define |times| # .. include sci_notation('%s%s10 :sup:`%s`', b, ' |times| ', lx) } }, as.character(x)) } sci_notation = function(format, base, times, power) { sprintf(format, base, ifelse(base == '', '', times), power) } # vectorized version of format_sci_one() format_sci = function(x, ...) { vapply(x, format_sci_one, character(1L), ..., USE.NAMES = FALSE) } # absolute path? is_abs_path = function(x) { if (is_windows()) grepl(':', x, fixed = TRUE) || grepl('^\\\\', x) else grepl('^[/~]', x) } # is tikz device without externalization? is_tikz_dev = function(options) { 'tikz' %in% options$dev && !options$external } tikz_dict = function(path) { paste(sans_ext(basename(path)), 'tikzDictionary', sep = '-') } # compatibility with Sweave and old beta versions of knitr fix_options = function(options) { options = as.strict_list(options) # if you want to use subfloats, fig.show must be 'hold' if (length(options$fig.subcap)) options$fig.show = 'hold' # the default device NULL is not valid; use pdf is not set if (is.null(options$dev)) options$dev = 'pdf' # FALSE means hide for options$results if (isFALSE(options$results)) options$results = 'hide' # the figure/cache filenames may contain UTF-8 chars, which won't work on # Windows, e.g. png() fails if filename contains UTF-8 chars (must use native # encoding); in rmarkdown::render(input), basename(input) may implicitly # convert the encoding of the filename `input` to UTF-8 options$fig.path = native_encode(options$fig.path) options$cache.path = native_encode(options$cache.path) # cache=TRUE -> 3; FALSE -> 0 if (is.logical(options$cache)) options$cache = options$cache * 3 # non-R code should not use cache=1,2 if (options$engine != 'R') options$cache = (options$cache > 0) * 3 options$eval = unname(options$eval) # if aspect ratio is specified, calculate figure height if (is.numeric(options$fig.asp)) { options$fig.height = options$fig.width * options$fig.asp } # out.[width|height].px: unit in pixels for sizes for (i in c('width', 'height')) { options[[sprintf('out.%s.px', i)]] = options[[sprintf('out.%s', i)]] %n% (options[[sprintf('fig.%s', i)]] * options$dpi) } # for Retina displays, increase physical size, and decrease output size if (is.numeric(r <- options$fig.retina) && r != 1) { if (is.null(options[['out.width']])) { options$out.width = options$fig.width * options$dpi } options$dpi = options$dpi * r } else { options$fig.retina = 1 } # turn x% to x/100\linewidth if (is_latex_output()) options['out.width'] = list(percent_latex_width(options[['out.width']])) # deal with aliases: a1 is real option; a0 is alias if (length(a1 <- opts_knit$get('aliases')) && length(a0 <- names(a1))) { for (i in seq_along(a1)) { # use alias only if the name exists in options if (a0[i] %in% names(options)) options[[a1[i]]] = options[[a0[i]]] } } options } is_latex_output = function() { out_format('latex') || pandoc_to(c('latex', 'beamer')) } # turn percent width to LaTeX unit, e.g. out.width = 30% -> .3\linewidth percent_latex_width = function(x) { if (!is.character(x)) return(x) i = grep('^[0-9.]+%$', x) if (length(i) == 0) return(x) xi = as.numeric(sub('%$', '', x[i])) if (any(is.na(xi))) return(x) x[i] = paste0(xi / 100, '\\linewidth') x } # parse but do not keep source parse_only = function(code) { if (length(code) == 0) return(expression()) parse(text = code, keep.source = FALSE) } # eval options as symbol/language objects eval_lang = function(x, envir = knit_global()) { if (!is.symbol(x) && !is.language(x)) return(x) eval(x, envir = envir) } # counterpart of isTRUE() isFALSE = function(x) identical(x, FALSE) # check latex packages; if not exist, copy them over to ./ test_latex_pkg = function(name, path) { res = try_silent(system(sprintf('%s %s.sty', kpsewhich(), name), intern = TRUE)) if (inherits(res, 'try-error') || !length(res)) { warning("unable to find LaTeX package '", name, "'; will use a copy from knitr") file.copy(path, '.') } } # get child and parent mode child_mode = function() opts_knit$get('child') parent_mode = function() opts_knit$get('parent') # return the output format, or if current format is in specified formats out_format = function(x) { fmt = opts_knit$get('out.format') if (missing(x)) fmt else !is.null(fmt) && (fmt %in% x) } # rmarkdown sets an option for the Pandoc output format from markdown pandoc_to = function(x) { fmt = opts_knit$get('rmarkdown.pandoc.to') if (missing(x)) fmt else !is.null(fmt) && (fmt %in% x) } # rmarkdown's input format pandoc_from = function() { opts_knit$get('rmarkdown.pandoc.from') %n% 'markdown' } pandoc_fragment = function(text, to = pandoc_to(), from = pandoc_from()) { if (length(text) == 0) return(text) f1 = tempfile('pandoc', '.', '.md'); f2 = tempfile('pandoc', '.') on.exit(unlink(c(f1, f2)), add = TRUE) writeLines(enc2utf8(text), f1, useBytes = TRUE) rmarkdown::pandoc_convert(f1, to, from, f2) code = readLines(f2, encoding = 'UTF-8', warn = FALSE) paste(code, collapse = '\n') } #' Path for figure files #' #' The filename of figure files is the combination of options \code{fig.path} #' and \code{label}. This function returns the path of figures for the current #' chunk by default. #' @param suffix a suffix of the filename; if it is not empty, nor does it #' contain a dot \code{.}, it will be treated as the filename extension (e.g. #' \code{png} will be used as \code{.png}) #' @param options a list of options; by default the options of the current chunk #' @param number the current figure number (by default the internal chunk option #' \code{fig.cur} if available) #' @return A character vector of the form \file{fig.path-label-i.suffix}. #' @note When there are special characters (not alphanumeric or \samp{-} or #' \samp{_}) in the path, they will be automatically replaced with \samp{_}. #' For example, \file{a b/c.d-} will be sanitized to \file{a_b/c_d-}. This #' makes the filenames safe to LaTeX. #' @export #' @examples fig_path('.pdf', options = list(fig.path='figure/abc-', label='first-plot')) #' fig_path('.png', list(fig.path='foo-', label='bar'), 1:10) fig_path = function(suffix = '', options = opts_current$get(), number) { if (suffix != '' && !grepl('[.]', suffix)) suffix = paste0('.', suffix) if (missing(number)) number = options$fig.cur %n% 1L if (!is.null(number)) suffix = paste0('-', number, suffix) path = valid_path(options$fig.path, options$label) (if (out_format(c('latex', 'sweave', 'listings'))) sanitize_fn else paste0)(path, suffix) } # sanitize filename for LaTeX sanitize_fn = function(path, suffix = '') { if (grepl('[^~:_./\\[:alnum:]-]', path)) { warning('replaced special characters in figure filename "', path, '" -> "', path <- gsub('[^~:_./\\[:alnum:]-]', '_', path), '"') } # replace . with _ except ../ and ./ s = strsplit(path, '[/\\\\]')[[1L]] i = (s != '.') & (s != '..') & grepl('\\.', s) if (any(i)) { s[i] = gsub('\\.', '_', s[i]) path = paste(s, collapse = '/') warning('dots in figure paths replaced with _ ("', path, '")') } paste0(path, suffix) } #' Obtain the figure filenames for a chunk #' #' Given a chunk label, the figure file extension, the figure number(s), and the #' chunk option \code{fig.path}, return the filename(s). #' #' This function can be used in an inline R expression to write out the figure #' filenames without hard-coding them. For example, if you created a plot in a #' code chunk with the label \code{foo} and figure path \file{my-figure/}, you #' are not recommended to use hard-coded figure paths like #' \samp{\includegraphics{my-figure/foo-1.pdf}} (in \file{.Rnw} documents) or #' \samp{![](my-figure/foo-1.png)} (R Markdown) in your document. Instead, you #' should use \samp{\\Sexpr{fig_chunk('foo', 'pdf')}} or \samp{![](`r #' fig_chunk('foo', 'png')`)}. #' #' You can generate plots in a code chunk but not show them inside the code #' chunk by using the chunk option \code{fig.show = 'hide'}. Then you can use #' this function if you want to show them elsewhere. #' @param label the chunk label #' @param ext the figure file extension, e.g. \code{png} or \code{pdf} #' @param number the figure number (by default \code{1}) #' @param fig.path the chunk option \code{fig.path} #' @return A character vector of filenames. #' @export #' @examples library(knitr) #' fig_chunk('foo', 'png') #' fig_chunk('foo', 'pdf') #' fig_chunk('foo', 'svg', 2) # the second plot of the chunk foo #' fig_chunk('foo', 'png', 1:5) # if the chunk foo produced 5 plots fig_chunk = function(label, ext = '', number, fig.path = opts_chunk$get('fig.path')) { fig_path(ext, list(fig.path = fig.path, label = label), number) } #' The global environment in which code chunks are evaluated #' #' This function makes the environment of a code chunk accessible inside a #' chunk. #' #' It returns the \code{envir} argument of \code{\link{knit}}, e.g. if we call #' \code{\link{knit}()} in the global environment, \code{knit_global()} returns #' R's global environment by default. You can call functions like #' \code{\link{ls}()} on this environment. #' @export knit_global = function() { .knitEnv$knit_global %n% globalenv() } # Indents a Block # Input # "library(ggplot2)\nqplot(wt, mpg, data = mtcars)" # Output # library(ggplot2) # qplot(wt, mpg, data = mtcars) indent_block = function(block, spaces = ' ') { if (is.null(block) || !any(nzchar(block))) return(rep(spaces, length(block))) if (spaces == '') return(block) line_prompt(block, spaces, spaces) } # print knitr logs print_knitlog = function() { if (!opts_knit$get('verbose') || child_mode() || !length(klog <- knit_log$get(drop = FALSE))) return() for (i in unlist(klog, use.names = FALSE)) { cat(sub('\n+$', '', i), '\n\n') if (length(code <- knit_code$get(sub('^Chunk ([^:]+):\n.*', '\\1', i)))) cat(code, sep = '\n') } cat('\nNumber of messages:\n') print(sapply(klog, length)) } # count the number of lines line_count = function(x) stringr::str_count(x, '\n') + 1L # faster than require() but less rigorous has_package = function(pkg) pkg %in% .packages(TRUE) # if LHS is NULL, return the RHS `%n%` = function(x, y) if (is.null(x)) y else x # merge elements of y into x with the same names merge_list = function(x, y) { x[names(y)] = y x } # paths of all figures all_figs = function(options, ext = options$fig.ext, num = options$fig.num) { fig_path(ext, options, number = seq_len(num)) } # evaluate an expression in a diretory and restore wd after that in_dir = function(dir, expr) { if (!is.null(dir)) { owd = setwd(dir); on.exit(setwd(owd)) } wd1 = getwd() res = expr wd2 = getwd() if (wd1 != wd2) warning( 'You changed the working directory to ', wd2, ' (probably via setwd()). ', 'It will be restored to ', wd1, '. See the Note section in ?knitr::knit' ) res } # evaluate under the base.dir in_base_dir = function(expr) { d = opts_knit$get('base.dir') if (is.character(d) && !file_test('-d', d)) dir.create(d, recursive = TRUE) in_dir(d, expr) } # escape special LaTeX characters escape_latex = function(x, newlines = FALSE, spaces = FALSE) { x = gsub('\\\\', '\\\\textbackslash', x) x = gsub('([#$%&_{}])', '\\\\\\1', x) x = gsub('\\\\textbackslash', '\\\\textbackslash{}', x) x = gsub('~', '\\\\textasciitilde{}', x) x = gsub('\\^', '\\\\textasciicircum{}', x) if (newlines) x = gsub('(? a quote', '', #' paste(rep('this is a normal paragraph', 5), collapse = ' '))) wrap_rmd = function(file, width = 80, text = NULL, backup) { x = if (is.null(text)) readLines(file, warn = FALSE) else split_lines(text) x = strip_white(x) # strip blank lines in the beginning and end if ((n <- length(x)) <= 1L) return(x) # are you kidding? idx = NULL # collect the lines to exclude from wrapping i = grep('^---$', x) # yaml preamble if (length(i) > 1 && i[1L] == 1L) idx = c(idx, i[1L]:i[2L]) i = grep('^(```|\\{% (end|)highlight [a-z ]*%\\}|)', x) # code blocks if (length(i)) { if (length(i) %% 2L != 0L) stop('markers for code blocks must be paired up') idx = c(idx, unlist(apply(matrix(i, ncol = 2L, byrow = TRUE), 1L, function(z) z[1L]:z[2L]))) } # section headers, indented code blocks and latex math idx = c(idx, grep('^(#|===|---| |\t)', x)) # blank lines idx = c(idx, grep('^\\s*$', x)) # TODO: this is naive -- I treat a line as (a part of) a normal paragraph if # it does not start with a space, or > (blockquotes) or -, *, 1. (lists), and # only wrap paragraphs idx = c(idx, grep('^\\s*( |> |- |\\* |\\d+ )', x)) idx = unique(idx) if (length(idx) == n) return(x) # no need to wrap anything i = logical(n); i[idx] = TRUE; r = rle(i) n = length(r$lengths); txt = vector('list', n); j = c(0L, cumsum(r$lengths)) for (i in seq_len(n)) { block = x[seq(j[i] + 1L, j[i + 1])] txt[[i]] = if (r$value[i]) { # those lines not to be wrapped gsub('\\s+$', '', block) # strip pending spaces } else { strwrap(paste(block, collapse = '\n'), width) } } txt = unlist(txt) if (is.null(text)) { if (missing(backup)) backup = file.path(dirname(file), paste0('__', basename(file))) if (!is.null(backup)) file.copy(file, backup, overwrite = TRUE) writeLines(txt, file) } else txt } # change the default device to an appropriate device when the output is html # (e.g. markdown, reST, AsciiDoc) set_html_dev = function() { # only change if device has not been set if (!is.null(opts_chunk$get('dev'))) return() # in some cases, png() does not work (e.g. options('bitmapType') == 'Xlib' on # headless servers); use svg then opts_chunk$set(dev = if (inherits(try_silent({ f = tempfile(); on.exit(unlink(f)); grDevices::png(f); grDevices::dev.off() }), 'try-error')) 'svg' else 'png') } # locate kpsewhich especially for Mac OS because /usr/texbin may not be in PATH kpsewhich = function() { if (Sys.info()['sysname'] != 'Darwin' || !file.exists(x <- '/usr/texbin/kpsewhich') || nzchar(Sys.which('kpsewhich'))) 'kpsewhich' else x } # call try with silent = TRUE try_silent = function(expr) try(expr, silent = TRUE) # check if a utility exists; if it does, save its availability in opts_knit has_utility = function(name, package = name) { name2 = paste('util', name, sep = '_') # e.g. util_pdfcrop if (is.logical(yes <- opts_knit$get(name2))) return(yes) yes = nzchar(Sys.which(name)) if (!yes) warning(package, ' not installed or not in PATH') opts_knit$set(setNames(list(yes), name2)) yes } is_windows = function() .Platform$OS.type == 'windows' #' Query the current input filename #' #' Returns the name of the input file passed to \code{\link{knit}()}. #' @param dir whether to prepend the current working directory to the file path #' (i.e. return an absolute path or a relative path) #' @return A character string, if this function is called inside an input #' document (otherwise \code{NULL}). #' @export current_input = function(dir = FALSE) { input = knit_concord$get('infile') outwd = opts_knit$get('output.dir') if (is.null(input)) return() if (dir) { if (is.null(outwd)) { warning('Cannot determine the directory of the input document') dir = FALSE } } if (!dir) return(basename(input)) if (is_abs_path(input)) input else file.path(outwd, input) } # import output handlers from evaluate default_handlers = evaluate:::default_output_handler # change the value handler in evaluate default handlers knit_handlers = function(fun, options) { if (!is.function(fun)) fun = function(x, ...) { res = withVisible(knit_print(x, ...)) # indicate the htmlwidget result with a special class so we can attach # the figure caption to it later in wrap.knit_asis if (inherits(x, 'htmlwidget')) class(res$value) = c(class(res$value), 'knit_asis_htmlwidget') if (res$visible) res$value else invisible(res$value) } if (length(formals(fun)) < 2) stop("the chunk option 'render' must be a function of the form ", "function(x, options) or function(x, ...)") merge_list(default_handlers, list(value = function(x, visible) { if (visible) fun(x, options = options) })) } # conditionally disable some features during R CMD check is_R_CMD_check = function() { ('CheckExEnv' %in% search()) || any(c('_R_CHECK_TIMINGS_', '_R_CHECK_LICENSE_') %in% names(Sys.getenv())) } # is the inst dir under . or ..? differs in R CMD build/INSTALL and devtools/roxygen2 inst_dir = function(...) { p = file.path(c('..', '.'), 'inst', ...) p[file.exists(p)] } # normalize two paths to see if they are the same file same_file = function(f1, f2) { f1 = normalizePath(f1, mustWork = FALSE) f2 = normalizePath(f2, mustWork = FALSE) f1 == f2 } # a restricted version of is.numeric (e.g. do not treat chron::chron() as # numeric since their behavior may be somewhat unpredictable, e.g. through # round(), #1118); see #1396 for difftime is_numeric = function(x) { class(x)[1] %in% c('numeric', 'integer', 'difftime') } # create \label{x} or (\#x); the latter is current an internal hack for bookdown create_label = function(..., latex = FALSE) { if (isTRUE(opts_knit$get('bookdown.internal.label'))) { lab1 = '(\\#'; lab2 = ')' } else if (latex) { lab1 = '\\label{'; lab2 = '}' } else { return('') # we don't want the label at all } paste0(lab1, ..., lab2) } # yes I hate partial matching attr = function(...) base::attr(..., exact = TRUE) #' Combine multiple words into a single string #' #' When a value from an inline R expression is a character vector of multiple #' elements, we may want to combine them into a phrase like \samp{a and b}, or #' \code{a, b, and c}. That is what this a helper function does. #' #' If the length of the input \code{words} is smaller than or equal to 1, #' \code{words} is returned. When \code{words} is of length 2, the first word #' and second word are combined using the \code{and} string. When the length is #' greater than 2, \code{sep} is used to separate all words, and the \code{and} #' string is prepended to the last word. #' @param words a character vector #' @param sep the separator to be inserted among words #' @param and a character string to be prepended to the last word #' @param before,after A character string to be added before/after each word #' @return A character string. #' @export #' @examples combine_words('a'); combine_words(c('a', 'b')) #' combine_words(c('a', 'b', 'c')) #' combine_words(c('a', 'b', 'c'), sep = ' / ', and = '') #' combine_words(c('a', 'b', 'c'), and = '') #' combine_words(c('a', 'b', 'c'), before = '"', after = '"') combine_words = function(words, sep = ', ', and = ' and ', before = '', after = before) { n = length(words) if (n == 0) return(words) words = paste0(before, words, after) if (n == 1) return(words) if (n == 2) return(paste(words, collapse = and)) if (grepl('^ ', and) && grepl(' $', sep)) and = gsub('^ ', '', and) words[n] = paste0(and, words[n]) paste(words, collapse = sep) } # check if a package is loadable loadable = function(pkg) requireNamespace(pkg, quietly = TRUE) warning2 = function(...) warning(..., call. = FALSE) stop2 = function(...) stop(..., call. = FALSE) raw_markers = c('!!!!!RAW-KNITR-CONTENT', 'RAW-KNITR-CONTENT!!!!!') #' @export #' @rdname raw_output extract_raw_output = function(text, markers = raw_markers) { r = sprintf('%s(.*?)%s', markers[1], markers[2]) x = paste(text, collapse = '\n') m = gregexpr(r, x) s = regmatches(x, m) n = length(s[[1]]) if (n == 0) return(list(value = text, chunks = character())) chunks = tokens = character(n) for (i in seq_len(n)) { chunks[i] = sub(r, '\\1', s[[1]][i]) tokens[i] = digest::digest(chunks[i]) s[[1]][i] = gsub(r, paste0(markers[1], tokens[i], markers[2]), s[[1]][i]) } regmatches(x, m) = s list(value = x, chunks = setNames(chunks, tokens)) } #' @export #' @rdname raw_output restore_raw_output = function(text, chunks, markers = raw_markers) { if ((n <- length(chunks)) == 0) return(text) text = enc2utf8(text); chunks = enc2utf8(chunks); tokens = names(chunks) for (i in seq_len(n)) { r = paste0(markers[1], tokens[i], markers[2]) text = gsub(r, chunks[i], text, fixed = TRUE, useBytes = TRUE) } Encoding(text) = 'UTF-8' text } #' Mark character strings as raw output that should not be converted #' #' These functions provide a mechanism to protect the character output of R code #' chunks. The output is annotated with special markers in \code{raw_output}; #' \code{extract_raw_output()} will extract raw output wrapped in the markers, #' and replace the raw output with its MD5 digest; \code{restore_raw_output()} #' will restore the MD5 digest with the original raw output. #' #' This mechanism is designed primarily for R Markdown pre/post-processors. In #' an R code chunk, you generate \code{raw_output()} to the Markdown output. In #' the pre-processor, you can \code{extract_raw_output()} from the Markdown #' file, store the raw output and MD5 digests, and remove the actual raw output #' from Markdown so Pandoc will never see it. In the post-processor, you can #' read the Pandoc output (e.g., an HTML or RTF file), and restore the raw #' output. #' @param x the character vector to be protected #' @param markers a character vector of length 2 to be used to wrap \code{x}; #' see \code{knitr:::raw_markers} for the default value #' @param ... arguments to be passed to \code{\link{asis_output}()} #' @param text for \code{extract_raw_output()}, the content of the input file #' (e.g. Markdown); for \code{restore_raw_output()}, the content of the output #' file (e.g. HTML generated by Pandoc from Markdown) #' @param chunks a named character vector returned from #' \code{extract_raw_output()} #' @return For \code{extract_raw_output()}, a list of two components #' \code{value} (the \code{text} with raw output replaced by MD5 digests) and #' \code{chunks} (a named character vector, of which the names are MD5 digests #' and values are the raw output). For \code{restore_raw_output()}, the #' restored \code{text}. #' @export #' @examples library(knitr) #' out = c('*hello*', raw_output('content *protect* me!'), '*world*') #' pre = extract_raw_output(out) #' str(pre) #' pre$value = gsub('[*]([^*]+)[*]', '\\1', pre$value) # think this as Pandoc conversion #' pre$value #' # raw output was protected from the conversion (e.g. *protect* was not converted) #' restore_raw_output(pre$value, pre$chunks) raw_output = function(x, markers = raw_markers, ...) { asis_output(paste(c(markers[1], x, markers[2]), collapse = ''), ...) } # a simple JSON serializer tojson = function(x) { if (is.null(x)) return('null') if (is.logical(x)) { if (length(x) != 1 || any(is.na(x))) stop('Logical values of length > 1 and NA are not supported') return(tolower(as.character(x))) } if (is.character(x) || is.numeric(x)) { return(json_vector(x, length(x) != 1 || inherits(x, 'AsIs'), is.character(x))) } if (is.list(x)) { if (length(x) == 0) return('{}') return(if (is.null(names(x))) { json_vector(unlist(lapply(x, tojson)), TRUE, quote = FALSE) } else { nms = paste0('"', names(x), '"') paste0('{\n', paste(nms, unlist(lapply(x, tojson)), sep = ': ', collapse = ',\n'), '\n}') }) } stop('The class of x is not supported: ', paste(class(x), collapse = ', ')) } json_vector = function(x, toArray = FALSE, quote = TRUE) { if (quote) { x = gsub('(["\\])', "\\\\\\1", x) x = gsub('[[:space:]]', " ", x) if (length(x)) x = paste0('"', x, '"') } if (toArray) paste0('[', paste(x, collapse = ', '), ']') else x } writeUTF8 = function(text, file, ...) { if (identical(file, '')) { cat(text, sep = '\n', file = file) } else { writeLines(enc2utf8(text), file, ..., useBytes = TRUE) } } trimws = function(x) gsub('^\\s+|\\s+$', '', x) optipng = function(dir = '.') { files = list.files(dir, '[.]png$', recursive = TRUE, full.names = TRUE) for (f in files) system2('optipng', shQuote(f)) } knitr/R/header.R0000644000175100001440000001266313142522202013174 0ustar hornikusers#' @include themes.R #' @include highlight.R # doc is the output of processed document insert_header = function(doc) { if (is.null(b <- knit_patterns$get('header.begin'))) return(doc) if (out_format('html')) return(insert_header_html(doc, b)) if (out_format(c('latex', 'listings', 'sweave'))) return(insert_header_latex(doc, b)) doc } # Makes latex header with macros required for highlighting, tikz and framed make_header_latex = function() { h = paste(c( sprintf('\\usepackage[%s]{graphicx}\\usepackage[%s]{color}', opts_knit$get('latex.options.graphicx') %n% '', opts_knit$get('latex.options.color') %n% ''), .header.maxwidth, opts_knit$get('header'), if (getOption('OutDec') != '.') '\\usepackage{amsmath}', if (out_format('latex')) '\\usepackage{alltt}' ), collapse = '\n') if (opts_knit$get('self.contained')) h else { writeLines(h, 'knitr.sty') '\\usepackage{knitr}' } } insert_header_latex = function(doc, b) { i = grep(b, doc) if (length(i) >= 1L) { # it is safer to add usepackage{upquote} before begin{document} than after # documentclass{article} because it must appear after usepackage{fontenc}; # see this weird problem: http://stackoverflow.com/q/12448507/559676 if (!out_format('listings') && length(j <- grep(p <- '(\\s*)(\\\\begin\\{document\\})', doc)[1L])) { doc[j] = sub(p, '\n\\\\IfFileExists{upquote.sty}{\\\\usepackage{upquote}}{}\n\\2', doc[j]) } i = i[1L]; l = stringr::str_locate(doc[i], b) tmp = stringr::str_sub(doc[i], l[, 1], l[, 2]) stringr::str_sub(doc[i], l[,1], l[,2]) = paste0(tmp, make_header_latex()) } else if (parent_mode() && !child_mode()) { # in parent mode, we fill doc to be a complete document doc[1L] = paste(c(getOption('tikzDocumentDeclaration'), make_header_latex(), .knitEnv$tikzPackages, '\\begin{document}', doc[1L]), collapse = '\n') doc[length(doc)] = paste( c(doc[length(doc)], .knitEnv$bibliography, '\\end{document}'), collapse = '\n' ) } doc } make_header_html = function() { h = opts_knit$get('header') h = h[setdiff(names(h), c('tikz', 'framed'))] if (opts_knit$get('self.contained')) { paste(c('', unlist(h[setdiff(names(h), 'highlight')])), collapse = '\n') } else { writeLines(h, 'knitr.css') '' } } insert_header_html = function(doc, b) { i = grep(b, doc) if (length(i) == 1L) { l = stringr::str_locate(doc[i], b) tmp = stringr::str_sub(doc[i], l[, 1], l[, 2]) stringr::str_sub(doc[i], l[,1], l[,2]) = paste0(tmp, '\n', make_header_html()) } doc } #' Set the header information #' #' Some output documents may need appropriate header information. For example, #' for LaTeX output, we need to write \samp{\\usepackage{tikz}} into the #' preamble if we use tikz graphics; this function sets the header information #' to be written into the output. #' #' By default, \pkg{knitr} will set up the header automatically. For example, if #' the tikz device is used, \pkg{knitr} will add \samp{\\usepackage{tikz}} to #' the LaTeX preamble, and this is done by setting the header component #' \code{tikz} to be a character string: \code{set_header(tikz = #' '\\usepackage{tikz}')}. Similary, when we highlight R code using the #' \pkg{highlight} package (i.e. the chunk option \code{highlight = TRUE}), #' \pkg{knitr} will set the \code{highlight} component of the header vector #' automatically; if the output type is HTML, this component will be different #' -- instead of LaTeX commands, it contains CSS definitions. #' #' For power users, all the components can be modified to adapt to a customized #' type of output. For instance, we can change \code{highlight} to LaTeX #' definitions of the \pkg{listings} package (and modify the output hooks #' accordingly), so we can decorate R code using the \pkg{listings} package. #' @param ... the header components; currently possible components are #' \code{highlight}, \code{tikz} and \code{framed}, which contain the #' necessary commands to be used in the HTML header or LaTeX preamble; note #' HTML output does not use the \code{tikz} and \code{framed} components (they #' do not make sense to HTML) #' @return The header vector in \code{opts_knit} is set. #' @export #' @examples set_header(tikz = '\\usepackage{tikz}') #' opts_knit$get('header') set_header = function(...) { opts_knit$set(header = merge_list(opts_knit$get('header'), c(...))) } .default.sty = inst_dir('themes', 'default.css') # header for Latex Syntax Highlighting .header.hi.tex = theme_to_header_latex(.default.sty)$highlight .knitr.sty = inst_dir('misc', 'knitr.sty') .header.framed = paste(readLines(.knitr.sty), collapse = '\n') # CSS for html syntax highlighting .header.hi.html = theme_to_header_html(.default.sty)$highlight rm(list = c('.default.sty', '.knitr.sty')) # do not need them any more .header.sweave.cmd = '\\newcommand{\\SweaveOpts}[1]{} % do not interfere with LaTeX \\newcommand{\\SweaveInput}[1]{} % because they are not real TeX commands \\newcommand{\\Sexpr}[1]{} % will only be parsed by R ' .header.maxwidth = '%% maxwidth is the original width if it is less than linewidth %% otherwise use linewidth (to make sure the graphics do not exceed the margin) \\makeatletter \\def\\maxwidth{ % \\ifdim\\Gin@nat@width>\\linewidth \\linewidth \\else \\Gin@nat@width \\fi } \\makeatother ' knitr/R/hooks-extra.R0000644000175100001440000001467613142522202014216 0ustar hornikusers#' Built-in chunk hooks to extend knitr #' #' Hook functions are called when the corresponding chunk options are not #' \code{NULL} to do additional jobs beside the R code in chunks. This package #' provides a few useful hooks, which can also serve as examples of how to #' define chunk hooks in \pkg{knitr}. #' #' The function \code{hook_pdfcrop()} can use the program \command{pdfcrop} to #' crop the extra white margin when the plot format is PDF to make better use of #' the space in the output document, otherwise we often have to struggle with #' \code{\link[graphics]{par}} to set appropriate margins. Note #' \command{pdfcrop} often comes with a LaTeX distribution such as MiKTeX or #' TeXLive, and you may not need to install it separately (use #' \code{Sys.which('pdfcrop')} to check it; if it not empty, you are able to use #' it). Similarly, when the plot format is not PDF (e.g. PNG), the program #' \command{convert} in ImageMagick is used to trim the white margins (call #' \command{convert input -trim output}). #' #' The function \code{hook_optipng()} calls the program \command{optipng} to #' optimize PNG images. Note the chunk option \code{optipng} can be used to #' provide additional parameters to the program \command{optipng}, e.g. #' \code{optipng = '-o7'}. #' #' The function \code{hook_pngquant()} calls the program \command{pngquant} to #' optimize PNG images. Note the chunk option \code{pngquant} can be used to #' provide additional parameters to the program \command{pngquant}, e.g. #' \code{pngquant = '--speed=1 --quality=0-50'}. #' #' When the plots are not recordable via \code{\link[grDevices]{recordPlot}} and #' we save the plots to files manually via other functions (e.g. \pkg{rgl} #' plots), we can use the chunk hook \code{hook_plot_custom} to help write code #' for graphics output into the output document. #' #' The hook \code{hook_purl()} can be used to write the code chunks to an R #' script. It is an alternative approach to \code{\link{purl}}, and can be more #' reliable when the code chunks depend on the execution of them (e.g. #' \code{\link{read_chunk}()}, or \code{\link{opts_chunk}$set(eval = FALSE)}). #' To enable this hook, it is recommended to associate it with the chunk option #' \code{purl}, i.e. \code{knit_hooks$set(purl = hook_purl)}. When this hook is #' enabled, an R script will be written while the input document is being #' \code{\link{knit}}. Currently the code chunks that are not R code or have the #' chunk option \code{purl=FALSE} are ignored. Please note when the cache is #' turned on (the chunk option \code{cache = TRUE}), no chunk hooks will be #' executed, hence \code{hook_purl()} will not work, either. To solve this #' problem, we need \code{cache = 2} instead of \code{TRUE} (see #' \url{https://yihui.name/knitr/demo/cache/} for the meaning of \code{cache = #' 2}). #' @rdname chunk_hook #' @param before,options,envir see references #' @references \url{https://yihui.name/knitr/hooks/#chunk_hooks} #' @seealso \code{\link[rgl]{rgl.snapshot}}, \code{\link[rgl]{rgl.postscript}}, #' \code{\link[rgl]{hook_rgl}}, \code{\link[rgl]{hook_webgl}} #' @note The two hook functions \code{hook_rgl()} and \code{hook_webgl()} were #' moved from \pkg{knitr} to the \pkg{rgl} package (>= v0.95.1247) after #' \pkg{knitr} v1.10.5, and you can \code{library(rgl)} to get them. #' @export #' @examples if (require('rgl') && exists('hook_rgl')) knit_hooks$set(rgl = hook_rgl) #' # then in code chunks, use the option rgl=TRUE hook_pdfcrop = function(before, options, envir) { # crops plots after a chunk is evaluated and plot files produced ext = options$fig.ext if (options$dev == 'tikz' && options$external) ext = 'pdf' if (before || (fig.num <- options$fig.num %n% 0L) == 0L) return() paths = all_figs(options, ext, fig.num) in_base_dir(for (f in paths) plot_crop(f)) } #' @export #' @rdname chunk_hook hook_optipng = function(before, options, envir) { hook_png(before, options, envir, 'optipng') } hook_png = function( before, options, envir, cmd = c('optipng', 'pngquant'), post_process = identity ) { if (before) return() num = options$fig.num if (length(num) == 0 || num == 0) return() # no figures ext = tolower(options$fig.ext) if (ext != 'png') { warning('this hook only works with PNG at the moment'); return() } cmd = match.arg(cmd) if (!nzchar(Sys.which(cmd))) { warning('cannot find ', cmd, '; please install and put it in PATH'); return() } paths = all_figs(options, ext) in_base_dir( lapply(paths, function(x) { message('optimizing ', x) cmd = paste(cmd, if (is.character(options[[cmd]])) options[[cmd]], shQuote(x)) (if (is_windows()) shell else system)(cmd) post_process(x) }) ) return() } #' @export #' @rdname chunk_hook hook_pngquant = function(before, options, envir) { if (is.null(options[['pngquant']])) options$pngquant = '--skip-if-larger' options[['pngquant']] = paste(options[['pngquant']], '--ext -fs8.png') hook_png(before, options, envir, 'pngquant', function(x) { # pngquant creates an output file with '-fs8.png' as the extension. x2 = sub("\\.png$", "-fs8.png", x) if (file.exists(x2)) file.rename(x2, x) }) } #' @export #' @rdname chunk_hook hook_plot_custom = function(before, options, envir){ if (before) return() # run hook after the chunk if (options$fig.show == 'hide') return() # do not show figures ext = options$fig.ext %n% dev2ext(options$dev) hook = knit_hooks$get('plot') n = options$fig.num if (n == 0L) n = options$fig.num = 1L # make sure fig.num is at least 1 res = unlist(lapply(seq_len(n), function(i) { options$fig.cur = i hook(fig_path(ext, options, i), reduce_plot_opts(options)) }), use.names = FALSE) paste(res, collapse = '') } #" a hook function to write out code from chunks #' @export #' @rdname chunk_hook hook_purl = function(before, options, envir) { # at the moment, non-R chunks are ignored; it is unclear what I should do if (before || !options$purl || options$engine != 'R') return() output = .knitEnv$tangle.file if (isFALSE(.knitEnv$tangle.start)) { .knitEnv$tangle.start = TRUE unlink(output) # write out knit_params() data from YAML params = .knitEnv$tangle.params if (length(params)) writeLines(params, output) .knitEnv$tangle.params = NULL } code = options$code if (isFALSE(options$eval)) code = comment_out(code, '# ', newline = FALSE) if (is.character(output)) { cat(label_code(code, options$params.src), file = output, sep = '\n', append = TRUE) } } knitr/R/output.R0000644000175100001440000010141613142522202013277 0ustar hornikusers#' Knit a document #' #' This function takes an input file, extracts the R code in it according to a #' list of patterns, evaluates the code and writes the output in another file. #' It can also tangle R source code from the input document (\code{purl()} is a #' wrapper to \code{knit(..., tangle = TRUE)}). The \code{knitr.purl.inline} #' option can be used to also tangle the code of inline expressions (disabled #' by default). #' #' For most of the time, it is not necessary to set any options outside the #' input document; in other words, a single call like #' \code{knit('my_input.Rnw')} is usually enough. This function will try to #' determine many internal settings automatically. For the sake of #' reproducibility, it is better practice to include the options inside the #' input document (to be self-contained), instead of setting them before #' knitting the document. #' #' First the filename of the output document is determined in this way: #' \file{foo.Rnw} generates \file{foo.tex}, and other filename extensions like #' \file{.Rtex}, \file{.Rhtml} (\file{.Rhtm}) and \file{.Rmd} #' (\file{.Rmarkdown}) will generate \file{.tex}, \file{.html} and \file{.md} #' respectively. For other types of files, if the filename contains #' \samp{_knit_}, this part will be removed in the output file, e.g., #' \file{foo_knit_.html} creates the output \file{foo.html}; if \samp{_knit_} is #' not found in the filename, \file{foo.ext} will produce \file{foo.txt} if #' \code{ext} is not \code{txt}, otherwise the output is \file{foo-out.txt}. If #' \code{tangle = TRUE}, \file{foo.ext} generates an R script \file{foo.R}. #' #' We need a set of syntax to identify special markups for R code chunks and R #' options, etc. The syntax is defined in a pattern list. All built-in pattern #' lists can be found in \code{all_patterns} (call it \code{apat}). First #' \pkg{knitr} will try to decide the pattern list based on the filename #' extension of the input document, e.g. \samp{Rnw} files use the list #' \code{apat$rnw}, \samp{tex} uses the list \code{apat$tex}, \samp{brew} uses #' \code{apat$brew} and HTML files use \code{apat$html}; for unkown extensions, #' the content of the input document is matched against all pattern lists to #' automatically determine which pattern list is being used. You can also manually #' set the pattern list using the \code{\link{knit_patterns}} object or the #' \code{\link{pat_rnw}} series functions in advance and \pkg{knitr} will #' respect the setting. #' #' According to the output format (\code{opts_knit$get('out.format')}), a set of #' output hooks will be set to mark up results from R (see #' \code{\link{render_latex}}). The output format can be LaTeX, Sweave and HTML, #' etc. The output hooks decide how to mark up the results (you can customize #' the hooks). #' #' The name \code{knit} comes from its counterpart \samp{weave} (as in Sweave), #' and the name \code{purl} (as \samp{tangle} in Stangle) comes from a knitting #' method `knit one, purl one'. #' #' If the input document has child documents, they will also be compiled #' recursively. See \code{\link{knit_child}}. #' #' See the package website and manuals in the references to know more about #' \pkg{knitr}, including the full documentation of chunk options and demos, #' etc. #' @param input path of the input file #' @param output path of the output file for \code{knit()}; if \code{NULL}, this #' function will try to guess and it will be under the current working #' directory #' @param tangle whether to tangle the R code from the input file (like #' \code{\link[utils]{Stangle}}) #' @param text a character vector as an alternative way to provide the input #' file #' @param quiet whether to suppress the progress bar and messages #' @param envir the environment in which the code chunks are to be evaluated #' (for example, \code{\link{parent.frame}()}, \code{\link{new.env}()}, or #' \code{\link{globalenv}()}) #' @param encoding the encoding of the input file; see \code{\link{file}} #' @return The compiled document is written into the output file, and the path #' of the output file is returned. If the \code{text} argument is not #' \code{NULL}, the compiled output is returned as a character vector. In #' other words, if you provide a file input, you get an output filename; if #' you provide a character vector input, you get a character vector output. #' @note The working directory when evaluating R code chunks is the directory of #' the input document by default, so if the R code involves external files #' (like \code{read.table()}), it is better to put these files under the same #' directory of the input document so that we can use relative paths. However, #' it is possible to change this directory with the package option #' \code{\link{opts_knit}$set(root.dir = ...)} so all paths in code chunks are #' relative to this \code{root.dir}. It is not recommended to change the #' working directory via \code{\link{setwd}()} in a code chunk, because it may #' lead to terrible consequences (e.g. figure and cache files may be written to #' wrong places). If you do use \code{setwd()}, please note that \pkg{knitr} #' will always restore the working directory to the original one. Whenever you #' feel confused, print \code{getwd()} in a code chunk to see what the working #' directory really is. #' #' The arguments \code{input} and \code{output} do not have to be restricted #' to files; they can be \code{stdin()}/\code{stdout()} or other types of #' connections, but the pattern list to read the input has to be set in #' advance (see \code{\link{pat_rnw}}), and the output hooks should also be #' set (see \code{\link{render_latex}}), otherwise \pkg{knitr} will try to #' guess the patterns and output format. #' #' If the \code{output} argument is a file path, it is strongly recommended to #' be in the current working directory (e.g. \file{foo.tex} instead of #' \file{somewhere/foo.tex}), especially when the output has external #' dependencies such as figure files. If you want to write the output to a #' different directory, it is recommended to set the working directory to #' that directory before you knit a document. For example, if the source #' document is \file{foo.Rmd} and the expected output is \file{out/foo.md}, #' you can write \code{setwd('out/'); knit('../foo.Rmd')} instead of #' \code{knit('foo.Rmd', 'out/foo.md')}. #' #' N.B. There is no guarantee that the R script generated by \code{purl()} can #' reproduce the computation done in \code{knit()}. The \code{knit()} process #' can be fairly complicated (special values for chunk options, custom chunk #' hooks, computing engines besides R, and the \code{envir} argument, etc). If #' you want to reproduce the computation in a report generated by #' \code{knit()}, be sure to use \code{knit()}, instead of merely executing #' the R script generated by \code{purl()}. This seems to be obvious, but some #' people \href{http://bit.ly/SnLi6h}{just do not get it}. #' @export #' @references Package homepage: \url{https://yihui.name/knitr/}. The \pkg{knitr} #' \href{https://yihui.name/knitr/demo/manual/}{main manual}: and #' \href{https://yihui.name/knitr/demo/graphics/}{graphics manual}. #' #' See \code{citation('knitr')} for the citation information. #' @examples library(knitr) #' (f = system.file('examples', 'knitr-minimal.Rnw', package = 'knitr')) #' knit(f) # compile to tex #' #' purl(f) # tangle R code #' purl(f, documentation = 0) # extract R code only #' purl(f, documentation = 2) # also include documentation knit = function(input, output = NULL, tangle = FALSE, text = NULL, quiet = FALSE, envir = parent.frame(), encoding = getOption('encoding')) { # is input from a file? (or a connection on a file) in.file = !missing(input) && (is.character(input) || prod(inherits(input, c('file', 'connection'), TRUE))) oconc = knit_concord$get(); on.exit(knit_concord$set(oconc), add = TRUE) # make a copy of the input path in input2 and change input to file path if (!missing(input)) input2 = input if (in.file && !is.character(input)) input = summary(input)$description if (child_mode()) { setwd(opts_knit$get('output.dir')) # always restore original working dir # in child mode, input path needs to be adjusted if (in.file && !is_abs_path(input)) { input = paste0(opts_knit$get('child.path'), input) input = input2 = file.path(input_dir(TRUE), input) } # respect the quiet argument in child mode (#741) optk = opts_knit$get(); on.exit(opts_knit$set(optk), add = TRUE) opts_knit$set(progress = opts_knit$get('progress') && !quiet) quiet = !opts_knit$get('progress') } else { opts_knit$set(output.dir = getwd()) # record working directory in 1st run knit_log$restore() on.exit(chunk_counter(reset = TRUE), add = TRUE) # restore counter adjust_opts_knit() # turn off fancy quotes, use smaller width oopts = options( useFancyQuotes = FALSE, width = opts_knit$get('width'), knitr.in.progress = TRUE, device = pdf_null ) on.exit(options(oopts), add = TRUE) # restore chunk options after parent exits optc = opts_chunk$get(); on.exit(opts_chunk$restore(optc), add = TRUE) ocode = knit_code$get(); on.exit(knit_code$restore(ocode), add = TRUE) on.exit(opts_current$restore(), add = TRUE) optk = opts_knit$get(); on.exit(opts_knit$set(optk), add = TRUE) opts_knit$set(tangle = tangle, encoding = encoding, progress = opts_knit$get('progress') && !quiet ) } # store the evaluation environment and restore on exit oenvir = .knitEnv$knit_global; .knitEnv$knit_global = envir on.exit({.knitEnv$knit_global = oenvir}, add = TRUE) ext = 'unknown' if (in.file) { input.dir = .knitEnv$input.dir; on.exit({.knitEnv$input.dir = input.dir}, add = TRUE) .knitEnv$input.dir = dirname(input) # record input dir ext = tolower(file_ext(input)) if ((is.null(output) || is.na(output)) && !child_mode()) output = basename(auto_out_name(input, ext)) # do not run purl() when the output is newer than input (the output might # have been generated by hook_purl) if (is.character(output) && !child_mode()) { out.purl = sub_ext(input, 'R') if (same_file(output, out.purl) && tangle && file_test('-nt', out.purl, input)) return(out.purl) otangle = .knitEnv$tangle.file # the tangled R script .knitEnv$tangle.file = normalizePath(out.purl, mustWork = FALSE) .knitEnv$tangle.start = FALSE on.exit({.knitEnv$tangle.file = otangle; .knitEnv$tangle.start = NULL}, add = TRUE) } if (is.null(getOption('tikzMetricsDictionary'))) { options(tikzMetricsDictionary = tikz_dict(input)) # cache tikz dictionary on.exit(options(tikzMetricsDictionary = NULL), add = TRUE) } knit_concord$set(infile = input, outfile = output) } encoding = correct_encode(encoding) text = if (is.null(text)) { readLines(if (is.character(input2)) { con = file(input2, encoding = encoding); on.exit(close(con), add = TRUE); con } else input2, warn = FALSE) } else split_lines(text) # make sure each element is one line if (!length(text)) { if (is.character(output)) file.create(output) return(output) # a trivial case: create an empty file and exit } apat = all_patterns; opat = knit_patterns$get() on.exit(knit_patterns$restore(opat), add = TRUE) if (length(opat) == 0 || all(vapply(opat, is.null, logical(1)))) { # use ext if cannot auto detect pattern if (is.null(pattern <- detect_pattern(text, ext))) { # nothing to be executed; just return original input if (is.null(output)) return(paste(text, collapse = '\n')) else { cat(text, sep = '\n', file = output); return(output) } } if (!(pattern %in% names(apat))) stop("a pattern list cannot be automatically found for the file extension '", ext, "' in built-in pattern lists; ", 'see ?knit_patterns on how to set up customized patterns') set_pattern(pattern) if (pattern == 'rnw' && length(sweave_lines <- which_sweave(text)) > 0) remind_sweave(if (in.file) input, sweave_lines) opts_knit$set(out.format = switch( pattern, rnw = 'latex', tex = 'latex', html = 'html', md = 'markdown', rst = 'rst', brew = 'brew', asciidoc = 'asciidoc', textile = 'textile' )) } if (is.null(out_format())) auto_format(ext) params = NULL # the params field from YAML if (out_format('markdown')) { if (child_mode()) { # in child mode, strip off the YAML metadata in Markdown if exists if (grepl('^---\\s*$', text[1])) { i = grep('^---\\s*$', text) if (length(i) >= 2) text = text[-(1:i[2])] } } else { params = knit_params(text) params = if (length(params)) c('params <-', capture.output(dput(flatten_params(params), '')), '') .knitEnv$tangle.params = params # for hook_purl() } } # change output hooks only if they are not set beforehand if (identical(knit_hooks$get(names(.default.hooks)), .default.hooks) && !child_mode()) { getFromNamespace(paste('render', out_format(), sep = '_'), 'knitr')() on.exit(knit_hooks$set(.default.hooks), add = TRUE) } progress = opts_knit$get('progress') if (in.file && !quiet) message(ifelse(progress, '\n\n', ''), 'processing file: ', input) res = process_file(text, output) res = paste(knit_hooks$get('document')(res), collapse = '\n') if (tangle) res = c(params, res) if (!is.null(output)) writeLines(if (encoding == '') res else native_encode(res, to = encoding), con = output, useBytes = encoding != '') if (!child_mode()) { dep_list$restore() # empty dependency list .knitEnv$labels = NULL } if (in.file && is.character(output) && file.exists(output)) { concord_gen(input, output) if (!quiet) message('output file: ', output, ifelse(progress, '\n', '')) } output %n% res } #' @rdname knit #' @param documentation an integer specifying the level of documentation to go #' the tangled script: \code{0} means pure code (discard all text chunks); #' \code{1} (default) means add the chunk headers to code; \code{2} means add #' all text chunks to code as roxygen comments #' @param ... arguments passed to \code{\link{knit}()} from \code{purl()} #' @export purl = function(..., documentation = 1L) { doc = opts_knit$get('documentation'); on.exit(opts_knit$set(documentation = doc)) opts_knit$set(documentation = documentation) knit(..., tangle = TRUE) } process_file = function(text, output) { groups = split_file(lines = text) n = length(groups); res = character(n) tangle = opts_knit$get('tangle') # when in R CMD check, turn off the progress bar (R-exts said the progress bar # was not appropriate for non-interactive mode, and I don't want to argue) progress = opts_knit$get('progress') && !is_R_CMD_check() if (progress) { pb = txtProgressBar(0, n, char = '.', style = 3) on.exit(close(pb), add = TRUE) } wd = getwd() for (i in 1:n) { if (!is.null(.knitEnv$terminate)) { res[i] = paste(.knitEnv$terminate, collapse = '\n') knit_exit(NULL) break # must have called knit_exit(), so exit early } if (progress) { setTxtProgressBar(pb, i) if (!tangle) cat('\n') # under tangle mode, only show one progress bar flush.console() } group = groups[[i]] res[i] = withCallingHandlers( if (tangle) process_tangle(group) else process_group(group), error = function(e) { setwd(wd) cat(res, sep = '\n', file = output %n% '') message( 'Quitting from lines ', paste(current_lines(i), collapse = '-'), ' (', knit_concord$get('infile'), ') ' ) } ) } if (!tangle) res = insert_header(res) # insert header # output line numbers if (concord_mode()) knit_concord$set(outlines = line_count(res)) print_knitlog() if (tangle) res = res[res != ''] res } auto_out_name = function(input, ext = tolower(file_ext(input))) { base = sans_ext(input) name = if (opts_knit$get('tangle')) c(base, '.R') else if (ext %in% c('rnw', 'snw')) c(base, '.tex') else if (ext %in% c('rmd', 'rmarkdown', 'rhtml', 'rhtm', 'rtex', 'stex', 'rrst', 'rtextile')) c(base, '.', substring(ext, 2L)) else if (grepl('_knit_', input)) sub('_knit_', '', input) else if (ext != 'txt') c(base, '.txt') else c(base, '-out.', ext) paste(name, collapse = '') } # determine output format based on file extension ext2fmt = c( rnw = 'latex', snw = 'latex', tex = 'latex', rtex = 'latex', stex = 'latex', htm = 'html', html = 'html', rhtml = 'html', rhtm = 'html', md = 'markdown', markdown = 'markdown', rmd = 'markdown', rmarkdown = 'markdown', brew = 'brew', rst = 'rst', rrst = 'rst' ) auto_format = function(ext) { fmt = ext2fmt[ext] if (is.na(fmt)) fmt = { warning('cannot automatically decide the output format') 'unknown' } opts_knit$set(out.format = fmt) invisible(fmt) } #' Knit a child document #' #' This function knits a child document and returns a character string to input #' the result into the main document. It is designed to be used in the chunk #' option \code{child} and serves as the alternative to the #' \command{SweaveInput} command in Sweave. #' @param ... arguments passed to \code{\link{knit}} #' @param options a list of chunk options to be used as global options inside #' the child document (ignored if not a list); when one uses the \code{child} #' option in a parent chunk, the chunk options of the parent chunk will be #' passed to the \code{options} argument here #' @inheritParams knit #' @return A character string of the content of the compiled child document is #' returned as a character string so it can be written back to the parent #' document directly. #' @references \url{https://yihui.name/knitr/demo/child/} #' @note This function is not supposed be called directly like #' \code{\link{knit}()}; instead it must be placed in a parent document to let #' \code{\link{knit}()} call it indirectly. #' #' The path of the child document is determined relative to the parent document. #' @export #' @examples # you can write \Sexpr{knit_child('child-doc.Rnw')} in an Rnw file 'main.Rnw' #' # to input results from child-doc.Rnw in main.tex #' #' # comment out the child doc by \Sexpr{knit_child('child-doc.Rnw', eval = FALSE)} knit_child = function(..., options = NULL, envir = knit_global()) { child = child_mode() opts_knit$set(child = TRUE) # yes, in child mode now on.exit(opts_knit$set(child = child)) # restore child status if (is.list(options)) { options$label = options$child = NULL # do not need to pass the parent label on if (length(options)) { optc = opts_chunk$get(names(options), drop = FALSE); opts_chunk$set(options) # if user did not touch opts_chunk$set() in child, restore the chunk option on.exit({ for (i in names(options)) if (identical(options[[i]], opts_chunk$get(i))) opts_chunk$set(optc[i]) }, add = TRUE) } } res = knit(..., tangle = opts_knit$get('tangle'), envir = envir, encoding = opts_knit$get('encoding') %n% getOption('encoding')) paste(c('', res), collapse = '\n') } #' Exit knitting early #' #' Sometimes we may want to exit the knitting process early, and completely #' ignore the rest of the document. This function provides a mechanism to #' terminate \code{\link{knit}()}. #' @param append a character vector to be appended to the results from #' \code{knit()} so far; by default, it is \samp{\end{document}} for LaTeX #' output, and \samp{} for HTML output to make the output #' document complete; for other types of output, it is an empty string #' @return Invisible \code{NULL}. An internal signal is set up (as a side #' effect) to notify \code{knit()} to quit as if it had reached the end of the #' document. #' @export #' @examples # see https://github.com/yihui/knitr-examples/blob/master/096-knit-exit.Rmd knit_exit = function(append) { if (missing(append)) append = if (out_format(c('latex', 'sweave', 'listings'))) '\\end{document}' else if (out_format('html')) '\n' else '' .knitEnv$terminate = append # use this terminate variable to notify knit() invisible() } knit_log = new_defaults() # knitr log for errors, warnings and messages #' Wrap evaluated results for output #' #' @param x output from \code{\link[evaluate]{evaluate}} #' @param options list of options used to control output #' @noRd wrap = function(x, options = list(), ...) { UseMethod('wrap', x) } #' @export wrap.list = function(x, options = list()) { if (length(x) == 0L) return(x) lapply(x, wrap, options) } # ignore unknown classes #' @export wrap.default = function(x, options) return() #' @export wrap.character = function(x, options) { if (options$results == 'hide') return() if (output_asis(x, options)) { if (!out_format('latex')) return(x) # latex output still need a tweak } else x = comment_out(x, options$comment) knit_hooks$get('output')(x, options) } # If you provide a custom print function that returns a character object of # class 'knit_asis', it will be written as is. #' @export wrap.knit_asis = function(x, options, inline = FALSE) { m = attr(x, 'knit_meta') knit_meta_add(m, if (missing(options)) '' else options$label) if (!missing(options)) { if (options$cache > 0 && isFALSE(attr(x, 'knit_cacheable'))) stop( "The code chunk '", options$label, "' is not cacheable; ", "please use the chunk option cache=FALSE on this chunk" ) # store metadata in an object named of the form .hash_meta when cache=TRUE if (length(m) && options$cache == 3) assign(cache_meta_name(options$hash), m, envir = knit_global()) if (inherits(x, 'knit_asis_htmlwidget')) { options$fig.cur = plot_counter() options = reduce_plot_opts(options) return(add_html_caption(options, x)) } } x = as.character(x) if (!out_format('latex') || inline) return(x) # latex output need the \end{kframe} trick options$results = 'asis' knit_hooks$get('output')(x, options) } #' @export wrap.source = function(x, options) { src = sub('\n$', '', x$src) if (!options$collapse && options$strip.white) src = strip_white(src) if (is_blank(src)) return() # an empty chunk knit_hooks$get('source')(src, options) } msg_wrap = function(message, type, options) { # when the output format is LaTeX, do not wrap messages (let LaTeX deal with wrapping) if (!length(grep('\n', message)) && !out_format(c('latex', 'listings', 'sweave'))) message = stringr::str_wrap(message, width = getOption('width')) knit_log$set(setNames( list(c(knit_log$get(type), paste0('Chunk ', options$label, ':\n ', message))), type )) message = msg_sanitize(message, type) knit_hooks$get(type)(comment_out(message, options$comment), options) } # set options(knitr.sanitize.errors = TRUE) to hide error messages, etc msg_sanitize = function(message, type) { type = match.arg(type, c('error', 'warning', 'message')) opt = getOption(sprintf('knitr.sanitize.%ss', type), FALSE) if (isTRUE(opt)) message = switch( type, error = 'An error occurred', warning = 'A warning was emitted', message = 'A message was emitted' ) else if (is.character(opt)) message = opt message } #' @export wrap.warning = function(x, options) { call = if (is.null(x$call)) '' else { call = deparse(x$call)[1] if (call == 'eval(expr, envir, enclos)') '' else paste(' in', call) } msg_wrap(sprintf('Warning%s: %s', call, x$message), 'warning', options) } #' @export wrap.message = function(x, options) { msg_wrap(paste(x$message, collapse = ''), 'message', options) } #' @export wrap.error = function(x, options) { msg_wrap(as.character(x), 'error', options) } #' @export wrap.recordedplot = function(x, options) { # figure number sequence for multiple plots fig.cur = plot_counter() options$fig.cur = fig.cur # put fig num in options name = fig_path('', options, number = fig.cur) in_base_dir( # automatically creates dir for plots if (!file_test('-d', dirname(name))) dir.create(dirname(name), recursive = TRUE) ) # vectorize over dev, ext and dpi: save multiple versions of the plot file = mapply( save_plot, width = options$fig.width, height = options$fig.height, dev = options$dev, ext = options$fig.ext, dpi = options$dpi, MoreArgs = list(plot = x, name = name, options = options), SIMPLIFY = FALSE )[[1]] if (options$fig.show == 'hide') return('') in_base_dir(knit_hooks$get('plot')(file, reduce_plot_opts(options))) } #' @export wrap.knit_image_paths = function(x, options = opts_chunk$get(), inline = FALSE) { hook_plot = knit_hooks$get('plot') options$fig.num = length(x) # remove the automatically set out.width when fig.retina is set, otherwise the # size of external images embedded via include_graphics() will be set to # fig.width * dpi in fix_options() if (is.numeric(r <- options$fig.retina)) { w1 = options$out.width w2 = options$fig.width * options$dpi / r if (length(w1) * length(w2) == 1 && is.numeric(w1) && w1 == w2) options['out.width'] = list(NULL) } dpi = attr(x, 'dpi') %n% options$dpi paste(unlist(lapply(seq_along(x), function(i) { options$fig.cur = i if (is.null(options[['out.width']])) options['out.width'] = list(raster_dpi_width(x[i], dpi)) hook_plot(x[i], reduce_plot_opts(options)) })), collapse = '') } #' @export wrap.html_screenshot = function(x, options = opts_chunk$get(), inline = FALSE) { ext = x$extension hook_plot = knit_hooks$get('plot') in_base_dir({ i = plot_counter() if (is.null(f <- x$file)) { f = fig_path(ext, options, i) dir.create(dirname(f), recursive = TRUE, showWarnings = FALSE) writeBin(x$image, f, useBytes = TRUE) } # crop white margins if (isTRUE(options$crop)) in_dir(dirname(f), plot_crop(basename(f))) options$fig.cur = i options = reduce_plot_opts(options) if (!is.null(x$url) && is.null(options$fig.link)) options$fig.link = x$url hook_plot(f, options) }) } #' @export wrap.knit_embed_url = function(x, options = opts_chunk$get(), inline = FALSE) { options$fig.cur = plot_counter() options = reduce_plot_opts(options) add_html_caption(options, sprintf( '', escape_html(x$url), options$out.width %n% '100%', x$height %n% '400px' )) } add_html_caption = function(options, code) { cap = .img.cap(options) if (cap == '') return(code) sprintf( '
\n%s\n

%s

\n
', css_text_align(options$fig.align), code, cap ) } #' A custom printing function #' #' The S3 generic function \code{knit_print} is the default printing function in #' \pkg{knitr}. The chunk option \code{render} uses this function by default. #' The main purpose of this S3 generic function is to customize printing of R #' objects in code chunks. We can fall back to the normal printing behavior by #' setting the chunk option \code{render = normal_print}. #' #' Users can write custom methods based on this generic function. For example, #' if we want to print all data frames as tables in the output, we can define a #' method \code{knit_print.data.frame} that turns a data.frame into a table (the #' implementation may use other R packages or functions, e.g. \pkg{xtable} or #' \code{\link{kable}()}). #' @param x an R object to be printed #' @param ... additional arguments passed to the S3 method (currently ignored, #' except two optional arguments \code{options} and \code{inline}; see #' the references below) #' @return The value returned from the print method should be a character vector #' or can be converted to a character value. You can wrap the value in #' \code{\link{asis_output}()} so that \pkg{knitr} writes the character value #' as is in the output. #' @note It is recommended to leave a \code{...} argument in your method, to #' allow future changes of the \code{knit_print()} API without breaking your #' method. #' @references See \code{vignette('knit_print', package = 'knitr')}. #' @export #' @examples library(knitr) #' # write tables for data frames #' knit_print.data.frame = function(x, ...) { #' res = paste(c('', '', kable(x, output = FALSE)), collapse = '\n') #' asis_output(res) #' } #' # after you defined the above method, data frames will be printed as tables in knitr, #' # which is different with the default print() behavior knit_print = function(x, ...) { if (need_screenshot(x, ...)) { html_screenshot(x) } else { UseMethod('knit_print') } } #" the default print method is just print()/show() #' @export knit_print.default = function(x, ..., inline = FALSE) { if (inline) x else normal_print(x) } #' @export knit_print.knit_asis = function(x, ...) x #' @rdname knit_print #' @export normal_print = default_handlers$value formals(normal_print) = alist(x = , ... = ) #' Mark an R object with a special class #' #' This is a convenience function that assigns the input object a class named #' \code{knit_asis}, so that \pkg{knitr} will treat it as is (the effect is the #' same as the chunk option \code{results = 'asis'}) when it is written to the #' output. #' #' This function is normally used in a custom S3 method based on the printing #' function \code{\link{knit_print}()}. #' #' For the \code{cacheable} argument, you need to be careful when printing the #' object involves non-trivial side effects, in which case it is strongly #' recommended to use \code{cacheable = FALSE} to instruct \pkg{knitr} that this #' object should not be cached using the chunk option \code{cache = TRUE}, #' otherwise the side effects will be lost the next time the chunk is knitted. #' For example, printing a \pkg{shiny} input element or an HTML widget in an R #' Markdown document may involve registering metadata about some JavaScript #' libraries or stylesheets, and the metadata may be lost if we cache the code #' chunk, because the code evaluation will be skipped the next time. This #' particular issue has been solved in \pkg{knitr} after v1.13 (the metadata #' will be saved and loaded automatically when caching is enabled), but not all #' metadata can be saved and loaded next time and still works in the new R #' session. #' @param x an R object (typically a character string, or can be converted to a #' character string via \code{\link{as.character}()}) #' @param meta additional metadata of the object to be printed (the metadata #' will be collected when the object is printed, and accessible via #' \code{knit_meta()}) #' @param cacheable a logical value indicating if this object is cacheable; if #' \code{FALSE}, \pkg{knitr} will stop when caching is enabled on code chunks #' that contain \code{asis_output()} #' @note This function only works in top-level R expressions, and it will not #' work when it is called inside another expression, such as a for-loop. See #' \url{https://github.com/yihui/knitr/issues/1137} for a discussion. #' @export #' @examples # see ?knit_print asis_output = function(x, meta = NULL, cacheable = NA) { structure(x, class = 'knit_asis', knit_meta = meta, knit_cacheable = cacheable) } #' Metadata about objects to be printed #' #' As an object is printed, \pkg{knitr} will collect metadata about it (if #' available). After knitting is done, all the metadata is accessible via this #' function. You can manually add metadata to the \pkg{knitr} session via #' \code{knit_meta_add()}. #' @param class optionally return only metadata entries that inherit from the #' specified class; the default, \code{NULL}, returns all entries. #' @param clean whether to clean the collected metadata; by default, the #' metadata stored in \pkg{knitr} is cleaned up once retrieved, because we may #' not want the metadata to be passed to the next \code{knit()} call; to be #' defensive (i.e. not to have carryover metadata), you can call #' \code{knit_meta()} before \code{knit()} #' @export #' @return \code{knit_meta()} returns the matched metadata specified by #' \code{class}; \code{knit_meta_add()} returns all current metadata. knit_meta = function(class = NULL, clean = TRUE) { if (is.null(class)) { if (clean) on.exit({.knitEnv$meta = list()}, add = TRUE) return(.knitEnv$meta) } # if a class was specified, match the items belonging to the class matches = if (length(.knitEnv$meta)) { vapply(.knitEnv$meta, inherits, logical(1), what = class) } if (!any(matches)) return(list()) if (clean) on.exit({ .knitEnv$meta[matches] = NULL id = attr(.knitEnv$meta, 'knit_meta_id') if (length(id)) attr(.knitEnv$meta, 'knit_meta_id') = id[!matches] }, add = TRUE) .knitEnv$meta[matches] } #' @param meta a metadata object to be added to the session #' @param label a chunk label to indicate which chunk the metadata belongs to #' @rdname knit_meta #' @export knit_meta_add = function(meta, label = '') { if (length(meta)) { meta_id = attr(.knitEnv$meta, 'knit_meta_id') .knitEnv$meta = c(.knitEnv$meta, meta) attr(.knitEnv$meta, 'knit_meta_id') = c(meta_id, rep(label, length(meta))) } .knitEnv$meta } knitr/R/citation.R0000644000175100001440000001303713142522202013552 0ustar hornikusers#' Generate BibTeX bibliography databases for R packages #' #' This function uses \code{\link[utils]{citation}} and #' \code{\link[utils]{toBibtex}} to create bib entries for R packages and write #' them in a file. Only the auto-generated citations are included for a package. #' This function can facilitate the auto-generation of bibliography databases #' for R packages, and it is easy to regenerate all the citations after updating #' R packages. #' #' The citation is forced to be generated from the \file{DESCRIPTION} file of #' the package (\code{citation(auto = TRUE)}). The keyword \samp{R-pkgname} is #' used for the bib item, where \samp{pkgname} is the name of the package. All #' references specified in the \file{CITATION} file of the package are ignored. #' The main purpose of this function is to automate the generation of the #' package citation information because it often changes (e.g. author, year, #' package version, ...). By comparison, paper/book citations don't change too #' often, so it is not a lot of work even if you just cut and paste such #' bibliography entries from \code{toBibtex(citation())}. #' #' @param x package names (packages which are not installed are ignored) #' @param file the (\file{.bib}) file to write (by default writes to the R #' console; ignored if it is \code{NULL}) #' @param tweak whether to fix some known problems in the citations, especially #' non-standard format of authors #' @param width the width of lines in bibliographyb entries (if \code{NULL}, #' lines will not be wrapped) #' @param prefix a prefix string for keys in BibTeX entries; by default, it is #' \samp{R-} unless \code{\link{option}('knitr.bib.prefix')} has been set to #' another string #' @return a list containing the citations (also written to the \code{file} as a #' side effect) #' @note Some packages on CRAN do not have standard bib entries, which was once #' reported by Michael Friendly at #' \url{https://stat.ethz.ch/pipermail/r-devel/2010-November/058977.html}. I #' find this a real pain, and there are no easy solutions except contacting #' package authors to modify their DESCRIPTION files. Anyway, the argument #' \code{tweak} has provided ugly hacks to deal with packages which are known #' to be non-standard in terms of the format of citations; \code{tweak = TRUE} #' is by no means intended to hide or modify the original citation #' information. It is just due to the loose requirements on package authors #' for the DESCRIPTION file. On one hand, I apologize if it really mangles the #' information about certain packages; on the other, I strongly recommend #' package authors to consider the \samp{Authors@@R} field (see the manual #' \emph{Writing R Extensions}) to make it easier for other people to cite R #' packages. See \code{knitr:::.tweak.bib} for details of tweaks. Also note #' this is subject to future changes since R packages are being updated. If #' you want to contribute more tweaks, please edit the file #' \file{inst/misc/tweak_bib.csv} in the source package. #' @export #' @author Yihui Xie and Michael Friendly #' @examples write_bib(c('RGtk2', 'gWidgets'), file = 'R-GUI-pkgs.bib') #' write_bib(c('animation', 'rgl', 'knitr', 'ggplot2')) #' write_bib(c('base', 'parallel', 'MASS')) # base and parallel are identical #' write_bib('cluster', prefix = '') # a empty prefix #' write_bib('digest', prefix = 'R-pkg-') # a new prefix #' write_bib('digest', tweak = FALSE) # original version #' #' # what tweak=TRUE does #' str(knitr:::.tweak.bib) write_bib = function( x = .packages(), file = '', tweak = TRUE, width = NULL, prefix = getOption('knitr.bib.prefix', 'R-') ) { idx = mapply(system.file, package = x) == '' if (any(idx)) { warning('package(s) ', paste(x[idx], collapse = ', '), ' not found') x = x[!idx] } x = setdiff(x, .base.pkgs) # remove base packages bib = sapply(x, function(pkg) { cite = citation(pkg, auto = if (pkg == 'base') NULL else TRUE) if (tweak) { # e.g. gpairs has "gpairs: " in the title cite$title = gsub(sprintf('^(%s: )(\\1)', pkg), '\\1', cite$title) # e.g. KernSmooth has & in the title cite$title = gsub(' & ', ' \\\\& ', cite$title) } entry = toBibtex(cite) entry[1] = sub('\\{,$', sprintf('{%s%s,', prefix, pkg), entry[1]) entry }, simplify = FALSE) if (tweak) { for (i in intersect(names(.tweak.bib), x)) { message('tweaking ', i) bib[[i]] = merge_list(bib[[i]], .tweak.bib[[i]]) } bib = lapply(bib, function(b) { b['author'] = sub('Duncan Temple Lang', 'Duncan {Temple Lang}', b['author']) b['title'] = sub("'RStudio'", 'RStudio', b['title']) if (!('year' %in% names(b))) b['year'] = .this.year idx = which(names(b) == '') if (!is.null(width)) b[-idx] = stringr::str_wrap(b[-idx], width, 2, 4) structure(c(b[idx[1L]], b[-idx], b[idx[2L]]), class = 'Bibtex') }) } bib = bib[sort(x)] if (!is.null(file) && length(x)) writeUTF8(unlist(bib), file) invisible(bib) } .this.year = sprintf(' year = {%s},', format(Sys.Date(), '%Y')) #' @include utils.R # hack non-standard author fields .tweak.bib = local({ x = read.csv(inst_dir('misc/tweak_bib.csv'), stringsAsFactors = FALSE) x = x[order(xtfrm(x$package)), , drop = FALSE] # reorder entries by package names write.csv(x, inst_dir('misc/tweak_bib.csv'), row.names = FALSE) setNames( lapply(x$author, function(a) c(author = sprintf(' author = {%s},', a))), x$package ) }) # no need to write bib for these packages .base.pkgs = setdiff(rownames(installed.packages(priority = 'base')), 'base') knitr/R/concordance.R0000644000175100001440000000301113142522202014205 0ustar hornikusers#' @include defaults.R # record input/output lines numbers in Rnw/tex and filenames knit_concord = new_defaults(list( inlines = NULL, outlines = NULL, infile = NULL, outfile = NULL )) # do not consider child mode for concordance concord_mode = function() { opts_knit$get('concordance') && !child_mode() && out_format(c('latex', 'sweave', 'listings')) } current_lines = function(i) { # a helpr function to return line numbers for block i n = knit_concord$get('inlines') n1 = sum(head(n, i)); n0 = n1 - n[i] + 2 c(min(n0, n1), n1) } # generate concordance for RStudio concord_gen = function(infile, outfile) { if (!concord_mode()) return() i = knit_concord$get('inlines'); o = knit_concord$get('outlines') if (is.null(i) || is.null(o)) { warning('cannot generate concordance due to incomplete line numbers') return() } stopifnot(length(i) == length(o)) steps = NULL # how many steps to jump forward to match output line numbers for (k in seq_along(i)) { steps = c(steps, if (o[k] >= i[k]) { rep(c(1L, 0L), c(i[k], o[k] - i[k])) } else { c(rep(1L, o[k] - 1L), i[k] - o[k] + 1L) }) } # generate data structure vals = rle(steps) vals = c(1L, as.numeric(rbind(vals$lengths, vals$values))) concordance = paste(strwrap(paste(vals, collapse = ' ')), collapse = ' %\n') confile = paste(sans_ext(outfile), 'concordance.tex', sep = '-') # write to file cat('\\Sconcordance{concordance:', outfile, ':', infile, ':%\n', concordance, '}\n', sep = '', file = confile) } knitr/R/plot.R0000644000175100001440000004615613142522202012726 0ustar hornikusers# graphics devices in base R, plus those in Cairo, cairoDevice, tikzDevice auto_exts = c( bmp = 'bmp', postscript = 'eps', pdf = 'pdf', png = 'png', svg = 'svg', jpeg = 'jpeg', pictex = 'tex', tiff = 'tiff', win.metafile = 'wmf', cairo_pdf = 'pdf', cairo_ps = 'eps', quartz_pdf = 'pdf', quartz_png = 'png', quartz_jpeg = 'jpeg', quartz_tiff = 'tiff', quartz_gif = 'gif', quartz_psd = 'psd', quartz_bmp = 'bmp', CairoJPEG = 'jpeg', CairoPNG = 'png', CairoPS = 'eps', CairoPDF = 'pdf', CairoSVG = 'svg', CairoTIFF = 'tiff', Cairo_pdf = 'pdf', Cairo_png = 'png', Cairo_ps = 'eps', Cairo_svg = 'svg', svglite = 'svg', tikz = 'tikz' ) dev2ext = function(x) { res = auto_exts[x] if (any(idx <- is.na(res))) { for (i in x[idx]) check_dev(i) stop2( 'cannot find appropriate filename extensions for device ', x[idx], '; ', "please use chunk option 'fig.ext' (https://yihui.name/knitr/options)" ) } unname(res) } check_dev = function(dev) { if (exists(dev, mode = 'function', envir = knit_global())) get(dev, mode = 'function', envir = knit_global()) else stop('the graphical device', sQuote(dev), 'does not exist (as a function)') } # quartiz devices under Mac quartz_dev = function(type, dpi) { force(type); force(dpi) function(file, width, height, ...) { grDevices::quartz(file = file, width = width, height = height, type = type, dpi = dpi, ...) } } # a wrapper of the tikzDevice::tikz device tikz_dev = function(...) { loadNamespace('tikzDevice') packages = switch( getOption('tikzDefaultEngine'), pdftex = getOption('tikzLatexPackages'), xetex = getOption('tikzXelatexPackages'), luatex = getOption('tikzLualatexPackages') ) tikzDevice::tikz(..., packages = c('\n\\nonstopmode\n', packages, .knitEnv$tikzPackages)) } # save a recorded plot save_plot = function(plot, name, dev, width, height, ext, dpi, options) { path = paste(name, ext, sep = '.') # when cache=2 and plot file exists, just return the filename if (options$cache == 2 && cache$exists(options$hash, options$cache.lazy)) { if (in_base_dir(!file.exists(path))) { purge_cache(options) stop('cannot find ', path, '; the cache has been purged; please re-compile') } return(paste(name, if (dev == 'tikz' && options$external) 'pdf' else ext, sep = '.')) } # built-in devices device = switch( dev, bmp = function(...) bmp(..., res = dpi, units = 'in'), postscript = function(...) { postscript(..., onefile = FALSE, horizontal = FALSE, paper = 'special') }, jpeg = function(...) jpeg(..., res = dpi, units = 'in'), pdf = grDevices::pdf, png = function(...) png(..., res = dpi, units = 'in'), svg = grDevices::svg, pictex = grDevices::pictex, tiff = function(...) tiff(..., res = dpi, units = 'in'), win.metafile = grDevices::win.metafile, cairo_pdf = grDevices::cairo_pdf, cairo_ps = grDevices::cairo_ps, quartz_pdf = quartz_dev('pdf', dpi), quartz_png = quartz_dev('png', dpi), quartz_jpeg = quartz_dev('jpeg', dpi), quartz_tiff = quartz_dev('tiff', dpi), quartz_gif = quartz_dev('gif', dpi), quartz_psd = quartz_dev('psd', dpi), quartz_bmp = quartz_dev('bmp', dpi), CairoJPEG = load_device('CairoJPEG', 'Cairo', dpi = dpi), CairoPNG = load_device('CairoPNG', 'Cairo', dpi = dpi), CairoTIFF = load_device('CairoTIFF', 'Cairo', dpi = dpi), CairoPS = load_device('CairoPS', 'Cairo'), CairoPDF = load_device('CairoPDF', 'Cairo'), CairoSVG = load_device('CairoSVG', 'Cairo'), Cairo_pdf = load_device('Cairo_pdf', 'cairoDevice'), Cairo_png = load_device('Cairo_png', 'cairoDevice'), Cairo_ps = load_device('Cairo_ps', 'cairoDevice'), Cairo_svg = load_device('Cairo_svg', 'cairoDevice'), svglite = load_device('svglite', 'svglite'), tikz = function(...) { tikz_dev(..., sanitize = options$sanitize, standAlone = options$external) }, check_dev(dev) ) in_base_dir(plot2dev(plot, name, dev, device, path, width, height, options)) } plot2dev = function(plot, name, dev, device, path, width, height, options) { dargs = get_dargs(options$dev.args, dev) # re-plot the recorded plot to an off-screen device do.call(device, c(list(path, width = width, height = height), dargs)) showtext(options$fig.showtext) # showtext support print(plot) dev.off() # Cairo::CairoPS always adds the extension .ps, even if you have specified an # extension like .eps (https://github.com/yihui/knitr/issues/1364) if (dev == 'CairoPS') { path2 = paste0(path, '.ps') if (file.exists(path2)) file.rename(path2, path) } # compile tikz to pdf if (dev == 'tikz' && options$external) { unlink(pdf.plot <- paste0(name, '.pdf')) owd = setwd(dirname(path)) # add old wd to TEXINPUTS (see #188) oti = Sys.getenv('TEXINPUTS'); on.exit(Sys.setenv(TEXINPUTS = oti)) Sys.setenv(TEXINPUTS = paste(owd, oti, sep = .Platform$path.sep)) latex = switch( getOption('tikzDefaultEngine'), pdftex = getOption('tikzLatex'), xetex = getOption('tikzXelatex'), luatex = getOption('tikzLualatex'), stop2('a LaTeX engine must be specified for tikzDevice') ) system2(latex, shQuote(basename(path)), stdout = NULL) setwd(owd) if (!file.exists(pdf.plot)) { if (file.exists(log <- paste(name, 'log', sep = '.'))) message(paste(readLines(log), collapse = '\n')) stop2('failed to compile ', path, ' to PDF') } path = pdf.plot } fig_process(options$fig.process, path) } # filter the dev.args option get_dargs = function(dargs, dev) { if (length(dargs) == 0) return() if (is.list(dargs) && all(sapply(dargs, is.list))) { # dev.args is list(dev1 = list(arg1 = val1, ...), dev2 = list(arg2, ...)) dargs = dargs[[dev]] } dargs } # this is mainly for Cairo and cairoDevice load_device = function(name, package, dpi = NULL) { dev = getFromNamespace(name, package) # dpi is for bitmap devices; units must be inches! if (is.null(dpi)) dev else function(...) dev(..., dpi = dpi, units = 'in') } # merge low-level plotting changes merge_low_plot = function(x, idx = sapply(x, evaluate::is.recordedplot)) { idx = which(idx); n = length(idx); m = NULL # store indices that will be removed if (n <= 1) return(x) i1 = idx[1]; i2 = idx[2] # compare plots sequentially for (i in 1:(n - 1)) { # remove the previous plot and move its index to the next plot if (is_low_change(x[[i1]], x[[i2]])) m = c(m, i1) i1 = idx[i + 1] i2 = idx[i + 2] } if (is.null(m)) x else x[-m] } # compare two recorded plots is_low_change = function(p1, p2) { p1 = p1[[1]]; p2 = p2[[1]] # real plot info is in [[1]] if (length(p2) < (n1 <- length(p1))) return(FALSE) # length must increase identical(p1[1:n1], p2[1:n1]) } # recycle some plot options such as fig.cap, out.width/height, etc when there # are multiple plots per chunk .recyle.opts = c('fig.cap', 'fig.scap', 'fig.env', 'fig.pos', 'fig.subcap', 'out.width', 'out.height', 'out.extra', 'fig.link') # when passing options to plot hooks, reduce the recycled options to scalars reduce_plot_opts = function(options) { i = options$fig.cur %n% 1L for (o in .recyle.opts) { v = options[[o]] if ((n <- length(v)) == 0) next if ((j <- i %% n) == 0) j = n options[o] = list(v[j]) } options } # the memory address of a NativeSymbolInfo object will be lost if it is saved to # disk; see http://markmail.org/message/zat2r2pfsvhrsfqz for the full # discussion; the hack below was stolen (with permission) from RStudio: # https://github.com/rstudio/rstudio/blob/master/src/cpp/r/R/Tools.R fix_recordedPlot = function(plot) { # restore native symbols for R >= 3.0 for (i in seq_along(plot[[1]])) { # get the symbol then test if it's a native symbol symbol = plot[[1]][[i]][[2]][[1]] if (inherits(symbol, 'NativeSymbolInfo')) { # determine the dll that the symbol lives in name = symbol[[if (is.null(symbol$package)) 'dll' else 'package']][['name']] pkgDLL = getLoadedDLLs()[[name]] # reconstruct the native symbol and assign it into the plot nativeSymbol = getNativeSymbolInfo( name = symbol$name, PACKAGE = pkgDLL, withRegistrationInfo = TRUE ) plot[[1]][[i]][[2]][[1]] <- nativeSymbol } } attr(plot, 'pid') = Sys.getpid() plot } # fix plots in evaluate() results fix_evaluate = function(list, fix = TRUE) { if (!fix) return(list) lapply(list, function(x) { if (evaluate::is.recordedplot(x)) fix_recordedPlot(x) else x }) } # remove the plots from the evaluate results for the case of cache=2; if we only # want to keep high-level plots, we need MD5 digests of the plot components so # that we will be able to filter out low-level changes later remove_plot = function(list, keep.high = TRUE) { lapply(list, function(x) { if (evaluate::is.recordedplot(x)) structure( if (keep.high) digest_plot(x) else NULL, class = 'recordedplot' ) else x }) } # replace the content of the recorded plot with MD5 digests so that merge_plot() # will still work, and this will also save disk space for the case of cache=2 digest_plot = function(x, level = 1) { if (!is.list(x) || level >= 3) return(digest::digest(x)) lapply(x, digest_plot, level = level + 1) } # a null device pdf_null = function(width = 7, height = 7, ...) { grDevices::pdf(NULL, width, height, ...) } fig_process = function(FUN, path) { if (is.function(FUN)) { path2 = FUN(path) if (!is.character(path2) || length(path2) != 1L) stop("'fig.process' must be a function that returns a character string") path = path2 } path } #' Crop a plot (remove the edges) using PDFCrop or ImageMagick #' #' The command \command{pdfcrop x x} is executed on a PDF plot file, and #' \command{convert x -trim x} is executed for other types of plot files, where #' \code{x} is the plot filename. #' #' The utility \command{pdfcrop} is often shipped with a LaTeX distribution, and #' \command{convert} is a command in ImageMagick (Windows users may have to put #' the bin path of ImageMagick into the \var{PATH} variable). #' @param x the plot filename #' @param quiet whether to suppress standard output from the command line #' utility #' @export #' @references PDFCrop: \url{https://www.ctan.org/pkg/pdfcrop}; the #' \command{convert} command in ImageMagick: #' \url{http://www.imagemagick.org/script/convert.php} #' @return The original filename. plot_crop = function(x, quiet = TRUE) { ext = tolower(file_ext(x)) if (ext == 'pdf') { if (!has_utility('pdfcrop')) return(x) } else if (!has_utility('convert', 'ImageMagick')) return(x) if (!quiet) message('cropping ', x) x = shQuote(x) if (ext == 'pdf') { cmd = 'pdfcrop' args = c(x, x) } else { cmd = 'convert' args = c(x, '-trim', x) } # see this post for why use shell() on Windoz: # http://comments.gmane.org/gmane.comp.lang.r.devel/38113 if (is_windows()) { shell(paste(c(cmd, args), collapse = ' ')) # no way to quiet cmd output on Windoz } else { system2(cmd, args = args, stdout = if (quiet) FALSE else "") } x } # a wrapper of showtext::showtext.begin() showtext = function(show) { if (isTRUE(show)) getFromNamespace('showtext.begin', 'showtext')() } # handle some special cases of par() par2 = function(x) { if (length(x) == 0) return() # this may not be correct, but there is no way to tell if the user set mfrow # or mfcol in par() (either setting will change mfrow/mfcol simultaneously), # and I just assume it was mfrow if (!is.null(x$mfrow)) { # do this before the rest of pars because setting mfrow/mfcol will reset cex par(mfrow = x$mfrow) x$mfrow = x$mfcol = NULL # do not restore mfg (#1215); this is unlikely to make sense, e.g. for # par(mfrow = c(1, 2)), mfg will be c(1, 2, 1, 2) when the second plot is # completed, but when the user generate a new plot, it should typically be # drawn at (1, 1) instead of (1, 2) x$mfg = NULL } # you are unlikely to want to reset these pars x$fig = x$fin = x$pin = x$plt = x$usr = NULL x$ask = NULL # does not make sense for typical non-interactive R sessions par(x) } #' Embed external images in \pkg{knitr} documents #' #' When plots are not generated from R code, there is no way for \pkg{knitr} to #' capture plots automatically. In this case, you may generate the images #' manually and pass their file paths to this function to include them in the #' output. The major advantage of using this function is that it is portable in #' the sense that it works for all document formats that \pkg{knitr} supports, #' so you do not need to think if you have to use, for example, LaTeX or #' Markdown syntax, to embed an external image. Chunk options related to #' graphics output that work for normal R plots also work for these images, such #' as \code{out.width} and \code{out.height}. #' @param path a character vector of image paths #' @param auto_pdf whether to use PDF images automatically when the output #' format is LaTeX, e.g. \file{foo/bar.png} will be replaced by #' \file{foo/bar.pdf} if the latter exists; this can be useful since normally #' PDF images are of higher qualities than raster images like PNG when the #' output is LaTeX/PDF #' @param dpi the DPI (dots per inch) value to be used to calculate the output #' width (in inches) of the images from the actual width (in pixels) divided #' by \code{dpi}; if not provided, the chunk option \code{dpi} is used; if #' \code{NA}, the output width will not be calculated #' @note This function is supposed to be used in R code chunks or inline R code #' expressions. You are recommended to use forward slashes (\verb{/}) as path #' separators instead of backslashes in the image paths. #' #' The automatic calculation of the output width requires the \pkg{png} #' package (for PNG images) or the \pkg{jpeg} package (for JPEG images). The #' width will not be calculated if the chunk option \code{out.width} is #' already provided or \code{dpi = NA}. #' @return The same as the input character vector \code{path} but it is marked #' with special internal S3 classes so that \pkg{knitr} will convert the file #' paths to proper output code according to the output format. #' @export include_graphics = function(path, auto_pdf = TRUE, dpi = NULL) { if (auto_pdf && is_latex_output()) { path2 = sub_ext(path, 'pdf') i = file.exists(path2) path[i] = path2[i] } structure(path, class = c('knit_image_paths', 'knit_asis'), dpi = dpi) } # calculate the width in inches for PNG/JPEG images given a DPI raster_dpi_width = function(path, dpi) { if (!file.exists(path) || is.na(dpi)) return() is_png = grepl('[.]png$', path, ignore.case = TRUE) is_jpg = grepl('[.]jpe?g$', path, ignore.case = TRUE) if (!is_png && !is_jpg) return() if (is_png) { if (!loadable('png')) return() meta = attr(png::readPNG(path, native = TRUE, info = TRUE), 'info') w = meta$dim[1] if (!is.numeric(dpi)) dpi = meta$dpi[1] if (!is.numeric(dpi)) return() # cannot calculate the desired width } else if (is_jpg) { if (!loadable('jpeg')) return() if (!is.numeric(dpi)) return() # there is no dpi info in JPEG w = ncol(jpeg::readJPEG(path, native = TRUE)) } if (is_latex_output()) { paste0(round(w / dpi, 2), 'in') } else if (is_html_output()) { round(w / (dpi / 96)) } } #' Embed a URL as an HTML iframe or a screenshot in \pkg{knitr} documents #' #' When the output format is HTML, \code{include_url()} inserts an iframe in the #' output; otherwise it takes a screenshot of the URL and insert the image in #' the output. \code{include_app()} takes the URL of a Shiny app and adds #' \samp{?showcase=0} to it (to disable the showcase mode), then passes the URL #' to \code{include_url()}. #' @param url a character string of a URL #' @param height the height of the iframe #' @return An R object with a special class that \pkg{knitr} recognizes #' internally to generate the iframe or screenshot. #' @seealso \code{\link{include_graphics}} #' @export include_url = function(url, height = '400px') { include_url2(url, height) } include_url2 = function(url, height = '400px', orig = url) { structure( list(url = url, height = height, url.orig = orig), class = c('knit_embed_url', 'knit_asis') ) } #' @rdname include_url #' @export include_app = function(url, height = '400px') { orig = url # store the original URL if (!grepl('?', url, fixed = TRUE)) url = paste0(url, '?showcase=0') include_url2(url, height, orig) } need_screenshot = function(x, ...) { options = list(...)[['options']] # user may say 'I know the consequence; just let me render HTML' if (isFALSE(options$screenshot.force)) return(FALSE) # force screenshotting even if the output format support HTML force = is.list(options) && isTRUE(options$screenshot.force) fmt = pandoc_to() i1 = inherits(x, 'htmlwidget') i2 = inherits(x, 'shiny.appobj') i3 = inherits(x, 'knit_embed_url') # not R Markdown v2, always screenshot htmlwidgets and shiny apps if (length(fmt) == 0 || force) return(i1 || i2 || i3) html_format = fmt %in% c('html', 'html5', 'revealjs', 's5', 'slideous', 'slidy') res = ((i1 || i3) && !html_format) || (i2 && !(html_format && runtime_shiny())) res && webshot_available() } runtime_shiny = function() { identical(opts_knit$get('rmarkdown.runtime'), 'shiny') } webshot_available = local({ res = NULL # cache the availablity of webshot/PhantomJS function() { if (is.null(res)) res <<- loadable('webshot') && !is.null(getFromNamespace('find_phantom', 'webshot')()) res } }) html_screenshot = function(x, options = opts_current$get(), ...) { i1 = inherits(x, 'htmlwidget') i2 = inherits(x, 'shiny.appobj') i3 = inherits(x, 'knit_embed_url') if (!(i1 || i2 || i3)) stop('Screenshotting for the class ', class(x)[1], ' is not supported.') # if user has specified the screenshot image, just use it if (!is.null(shots <- options$screenshot.alt)) { i = shot_counter() if (length(shots) < i) stop('Not enough number of screenshots provided') return(structure(list(file = shots[i]), class = 'html_screenshot')) } ext = switch(options$dev, pdf = '.pdf', jpeg = '.jpeg', '.png') wargs = options$screenshot.opts %n% list() if (is.null(wargs$vwidth)) wargs$vwidth = options$out.width.px if (is.null(wargs$vheight)) wargs$vheight = options$out.height.px if (is.null(wargs$delay)) wargs$delay = if (i1) 0.2 else 1 d = tempfile() dir.create(d); on.exit(unlink(d, recursive = TRUE), add = TRUE) f = in_dir(d, { if (i1 || i3) { if (i1) { f1 = basename(tempfile('widget', '.', '.html')) save_widget(x, f1, FALSE, options = options) } else f1 = x$url f2 = tempfile('webshot', '.', ext) do.call(webshot::webshot, c(list(f1, f2), wargs)) normalizePath(f2) } else if (i2) { f = tempfile('webshot', '.', ext) do.call(webshot::appshot, c(list(x, f), wargs)) normalizePath(f) } }) res = readBin(f, 'raw', file.info(f)[, 'size']) structure( list(image = res, extension = ext, url = if (i3) x$url.orig), class = 'html_screenshot' ) } save_widget = function(..., options) { FUN = htmlwidgets::saveWidget if ('knitrOptions' %in% names(formals(FUN))) { FUN(..., knitrOptions = options) } else FUN(...) } knitr/R/utils-conversion.R0000644000175100001440000002605513142522202015267 0ustar hornikusers#' A wrapper for rst2pdf #' #' Convert reST to PDF using \command{rst2pdf} (which converts from rst to PDF #' using the ReportLab open-source library). #' @param input the input rst file #' @param command a character string which gives the path of the #' \command{rst2pdf} program (if it is not in PATH, the full path has to be #' given) #' @param options extra command line options, e.g. \code{'-v'} #' @author Alex Zvoleff and Yihui Xie #' @return An input file \file{*.rst} will produce \file{*.pdf} and this output #' filename is returned if the conversion was successful. #' @export #' @seealso \code{\link{knit2pdf}} #' @references \url{https://github.com/rst2pdf/rst2pdf} rst2pdf = function(input, command = 'rst2pdf', options = '') { out = sub_ext(input, 'pdf') system2(command, paste(shQuote(input), '-o', shQuote(out), options)) if (file.exists(out)) out else stop('conversion by rst2pdf failed!') } #' Convert various input files to various output files using \code{knit()} and #' Pandoc #' #' Knits the input file and compiles to an output format using Pandoc. #' @inheritParams knit #' @param to a character string describing the Pandoc output format to use #' @param pandoc_wrapper an R function used to call Pandoc; by default, if #' \pkg{rmarkdown} installed uses #' \code{rmarkdown::\link[rmarkdown]{pandoc_convert}()} else #' \code{\link{pandoc}()}. #' @param ... options to be passed to the \code{pandoc_wrapper} function #' @author Trevor L. Davis #' @return Returns the output of the \code{pandoc_wrapper} function. #' @export knit2pandoc = function( input, output = NULL, tangle = FALSE, text = NULL, quiet = FALSE, envir = parent.frame(), encoding = getOption('encoding'), to = 'html', pandoc_wrapper = NULL, ... ) { knit_output = knit(input, output, tangle, text, quiet, envir, encoding) if (!is.null(pandoc_wrapper)) return(pandoc_wrapper(knit_output, to, ...)) if (!has_package('rmarkdown')) return(pandoc(knit_output, to, ...)) output = gsub(paste0(file_ext(knit_output), '$'), to, knit_output) rmarkdown::pandoc_convert(knit_output, to, output = output, ...) } #' Convert Rnw or Rrst files to PDF using knit() and texi2pdf() or rst2pdf() #' #' Knit the input Rnw or Rrst document, and compile to PDF using \code{texi2pdf} #' or \code{rst2pdf}. #' @inheritParams knit #' @param compiler a character string which gives the LaTeX program used to #' compile the tex document to PDF (by default it uses the default setting of #' \code{\link[tools]{texi2pdf}}, which is often PDFLaTeX); this argument will #' be used to temporarily set the environmental variable \samp{PDFLATEX}. For #' an Rrst file, setting compiler to \code{'rst2pdf'} will use #' \code{\link{rst2pdf}} to compiles the rst file to PDF using the ReportLab #' open-source library. #' @param ... options to be passed to \code{\link[tools]{texi2pdf}} or #' \code{\link{rst2pdf}} #' @author Ramnath Vaidyanathan, Alex Zvoleff and Yihui Xie #' @return The filename of the PDF file. #' @note The \code{output} argument specifies the output filename to be passed #' to the PDF compiler (e.g. a tex document) instead of the PDF filename. #' @export #' @seealso \code{\link{knit}}, \code{\link[tools]{texi2pdf}}, #' \code{\link{rst2pdf}} #' @examples #' compile with xelatex #' ## knit2pdf(..., compiler = 'xelatex') #' #' #' compile a reST file with rst2pdf #' ## knit2pdf(..., compiler = 'rst2pdf') knit2pdf = function(input, output = NULL, compiler = NULL, envir = parent.frame(), quiet = FALSE, encoding = getOption('encoding'), ...) { out = knit(input, output = output, envir = envir, quiet = quiet, encoding = encoding) owd = setwd(dirname(out)); on.exit(setwd(owd)) if (is.null(compiler) && grepl('\\.rst$', out)) compiler = 'rst2pdf' if (!is.null(compiler)) { if (compiler == 'rst2pdf') { if (tolower(file_ext(out)) != 'rst') stop('for rst2pdf compiler input must be a .rst file') rst2pdf(basename(out), ...) return(sub_ext(out, 'pdf')) } else { # use the specified PDFLATEX command oc = Sys.getenv('PDFLATEX', NA) on.exit( if (is.na(oc)) Sys.unsetenv('PDFLATEX') else Sys.setenv(PDFLATEX = oc), add = TRUE ) Sys.setenv(PDFLATEX = compiler) } } tools::texi2pdf(basename(out), ...) sub_ext(out, 'pdf') } #' Convert markdown to HTML using knit() and markdownToHTML() #' #' This is a convenience function to knit the input markdown source and call #' \code{\link[markdown]{markdownToHTML}()} in the \pkg{markdown} package to #' convert the result to HTML. #' @inheritParams knit #' @param ... options passed to \code{\link[markdown]{markdownToHTML}} #' @param force_v1 whether to force rendering the input document as an R #' Markdown v1 document (even if it is for v2) #' @export #' @seealso \code{\link{knit}}, \code{\link[markdown]{markdownToHTML}} #' @return If the argument \code{text} is NULL, a character string (HTML code) #' is returned; otherwise the result is written into a file and the filename #' is returned. #' @note The \pkg{markdown} package is for R Markdown v1, which is much less #' powerful than R Markdown v2, i.e. the \pkg{rmarkdown} package #' (\url{http://rmarkdown.rstudio.com}). To render R Markdown v2 documents to #' HTML, please use \code{rmarkdown::render()} instead. #' @examples # a minimal example #' writeLines(c("# hello markdown", '```{r hello-random, echo=TRUE}', 'rnorm(5)', '```'), 'test.Rmd') #' knit2html('test.Rmd') #' if (interactive()) browseURL('test.html') knit2html = function(input, output = NULL, ..., envir = parent.frame(), text = NULL, quiet = FALSE, encoding = getOption('encoding'), force_v1 = FALSE) { if (!force_v1 && is.null(text)) { con = file(input, encoding = encoding) on.exit(close(con), add = TRUE) signal = if (is_R_CMD_check()) warning2 else stop2 if (length(grep('^---\\s*$', head(readLines(con), 1)))) signal( 'It seems you should call rmarkdown::render() instead of knitr::knit2html() ', 'because ', input, ' appears to be an R Markdown v2 document.' ) } out = knit(input, text = text, envir = envir, encoding = encoding, quiet = quiet) if (is.null(text)) { output = sub_ext(if (is.null(output) || is.na(output)) out else output, 'html') markdown::markdownToHTML(out, output, encoding = encoding, ...) invisible(output) } else markdown::markdownToHTML(text = out, ...) } knit2html_v1 = function(...) knit2html(..., force_v1 = TRUE) #' Knit an R Markdown document and post it to WordPress #' #' This function is a wrapper around the \pkg{RWordPress} package. It compiles #' an R Markdown document to HTML and post the results to WordPress. #' @param input the filename of the Rmd document #' @param title the post title #' @param ... other meta information of the post, e.g. \code{categories = c('R', #' 'Stats')} and \code{mt_keywords = c('knitr', 'wordpress')}, etc #' @param shortcode a logical vector of length 2: whether to use the shortcode #' \samp{[sourcecode lang='lang']} which can be useful to WordPress.com users #' for syntax highlighting of source code and output; the first element #' applies to source code, and the second applies to text output (by default, #' both are \code{FALSE}) #' @param action to create a new post, update an existing post, or create a new #' page #' @param postid if action is \code{editPost}, the post id \code{postid} must be #' specified #' @param publish whether to publish the post immediately #' @inheritParams knit #' @export #' @references \url{https://yihui.name/knitr/demo/wordpress/} #' @author William K. Morris, Yihui Xie, and Jared Lander #' @note This function will convert the encoding of the post and the title to #' UTF-8 internally. If you have additional data to send to WordPress (e.g. #' keywords and categories), you may have to manually convert them to the #' UTF-8 encoding with the \code{\link{iconv}(x, to = 'UTF-8')} function #' (especially when using Windows). #' @examples # see the reference knit2wp = function( input, title = 'A post from knitr', ..., envir = parent.frame(), shortcode = FALSE, action = c('newPost', 'editPost', 'newPage'), postid, encoding = getOption('encoding'), publish = TRUE ) { out = knit(input, encoding = encoding, envir = envir); on.exit(unlink(out)) con = file(out, encoding = encoding); on.exit(close(con), add = TRUE) content = native_encode(readLines(con, warn = FALSE)) content = paste(content, collapse = '\n') content = markdown::markdownToHTML(text = content, fragment.only = TRUE) shortcode = rep(shortcode, length.out = 2L) if (shortcode[1]) content = gsub( '
(.+?)
', '[sourcecode language="\\1"]\\2[/sourcecode]', content ) content = gsub( '
(.+?)
', if (shortcode[2]) '[sourcecode]\\2[/sourcecode]' else '
\\2
', content ) content = native_encode(content, 'UTF-8') title = native_encode(title, 'UTF-8') # figure out if we are making a newPost or overwriting an existing post action = match.arg(action) # build a list of arguments to be fed into either newPost or editPost # the first argument is the content, which itself is a list containing # description # title # ... # then there is the publish argument WPargs = list(content = list(description = content, title = title, ...), publish = publish) # if we are editing the post, also include the argument for postid if (action == "editPost") WPargs = c(postid = postid, WPargs) do.call('library', list(package = 'RWordPress', character.only = TRUE)) do.call(action, args = WPargs) } #' Watch an input file continuously and knit it when it is updated #' #' Check the modification time of an input file continously in an infinite loop. #' Whenever the time indicates the file has been modified, call a function to #' recompile the input file. #' #' This is actually a general function not necessarily restricted to #' applications in \pkg{knitr}. You may specify any \code{compile} function to #' process the \code{input} file. To stop the infinite loop, press the #' \samp{Escape} key or \samp{Ctrl + C} (depending on your editing environment #' and operating system). #' @param input an input file path (or a character vector of mutiple paths of #' input files) #' @param compile a function to compile the \code{input} file, e.g. it can be #' \code{\link{knit}} or \code{\link{knit2pdf}} depending on the input file #' and the output you want #' @param interval a time interval to pause in each cycle of the infinite loop #' @param ... other arguments to be passed to the \code{compile} function #' @export #' @examples # knit_watch('foo.Rnw', knit2pdf) #' #' # knit_watch('foo.Rmd', rmarkdown::render) knit_watch = function(input, compile = knit, interval = 1, ...) { mtime = function(...) file.info(...)[, 'mtime'] last_time = mtime(input) updated = function() { this_time = mtime(input) on.exit(last_time <<- this_time, add = TRUE) this_time > last_time } for (f in input) compile(f, ...) while (TRUE) { for (f in input[updated()]) compile(f, ...) Sys.sleep(interval) } } knitr/R/rocco.R0000644000175100001440000000721013142522202013041 0ustar hornikusers# move paragraphs of images one row above, and split the last paragraph from the # previous ones docAdjust = function(x) { if ((n <- length(x)) < 2) return(x) m = gregexpr('^\\s*

(' for (i in 2:n) if (m[[i]] > 0) { img = regmatches(x[i], m[[i]]) txt = unlist(regmatches(x[i], m[[i]], invert = TRUE)) if (grepl('^\\s*$', x[i - 1])) { x[i - 1] = img } else { x[i - 1] = paste(x[i - 1], restart, img, sep = '\n') } x[i] = paste(txt, collapse = '') } # split a doc cell if it has mutiple paragraphs, so that the code cell on the # right can match with its last paragraph x[2:n - 1] = unlist(lapply(strsplit(x[2:n - 1], '\n{2,}'), function(z) { n = length(z) if (n <= 1) return(z) if (length(idx <- grep('^\\s*$', z, invert = TRUE)) > 1) { i = max(idx) z[i] = paste0(restart, z[i]) } paste(z, collapse = '\n\n') })) # might have produced some empty cells, so remove them gsub('\\s*\\s*', '', x) } #' Knit R Markdown using the classic Docco style #' #' The classic Docco style is a two-column layout, with text in the left and #' code in the right column. #' #' The output HTML page supports resizing and hiding/showing the two columns. #' Move the cursor to the center of the page, and it will change to a #' bidirectional resize cursor; drag the cursor to resize the two columns. Press #' the key \code{t} to hide the code column (show the text column only), and #' press again to hide the text column (show code). #' @param input path of the input R Markdown file #' @param ... arguments to be passed to \code{\link{knit2html}} #' @return An HTML file is written, and its name is returned. #' @author Weicheng Zhu and Yihui Xie #' @references The Docco package by Jeremy Ashkenas: #' \url{https://github.com/jashkenas/docco} #' @export #' @examples rocco_view=function(input) {if (!file.exists(input)) return() #' o=rocco(input, header='', quiet=TRUE) #' if (interactive()) browseURL(o)} #' # knit these two vignettes using the docco style #' rocco_view(system.file('doc', 'docco-classic.Rmd', package = 'knitr')) #' rocco_view(system.file('doc', 'knit_expand.Rmd', package = 'knitr')) rocco = function(input, ...) { out = knit2html( input, ..., stylesheet = system.file('misc', 'docco-classic.css', package = 'knitr'), template = system.file('misc', 'docco-classic.html', package = 'knitr') ) txt = readLines(out) i1 = min(grep('$', txt)) i2 = max(grep('$', txt)) x = paste(txt[seq(i1 + 1, i2 - 1)], collapse = '\n') x = gsub('\\s*

', '', x)  # merge pre blocks
  m = gregexpr('
(.|\n)*?
', x) if (m[[1]][1] == -1) stop('No code blocks in HTML output') code = regmatches(x, m)[[1]] code = gsub('', '
\n
', code) # restore pre blocks
  code = paste0('', c(code, ''), '')
  doc = regmatches(x, m, invert = TRUE)[[1]]
  doc = paste0('', docAdjust(doc), '')

  # write pilcrow anchors to rows
  sec = 1
  for (i in seq_along(doc)) {
    while (grepl('', doc[i])) {
      doc[i] = sub('', paste0(
        '', ''
      ),  doc[i])
      sec = sec + 1
    }
  }

  html = c(txt[1:i1], paste0(doc, code, collapse = ''), txt[i2:length(txt)])
  writeLines(html, out)
  invisible(out)
}
knitr/R/block.R0000644000175100001440000004377613142522202013047 0ustar  hornikusers# S3 method to deal with chunks and inline text respectively
process_group = function(x) {
  UseMethod('process_group', x)
}
#' @export
process_group.block = function(x) call_block(x)
#' @export
process_group.inline = function(x) {
  x = call_inline(x)
  knit_hooks$get('text')(x)
}


call_block = function(block) {
  # now try eval all options except those in eval.after and their aliases
  af = opts_knit$get('eval.after'); al = opts_knit$get('aliases')
  if (!is.null(al) && !is.null(af)) af = c(af, names(al[af %in% al]))

  # expand parameters defined via template
  if (!is.null(block$params$opts.label)) {
    block$params = merge_list(opts_template$get(block$params$opts.label), block$params)
  }

  params = opts_chunk$merge(block$params)
  opts_current$restore(params)
  for (o in setdiff(names(params), af)) params[o] = list(eval_lang(params[[o]]))
  params = fix_options(params)  # for compatibility

  label = ref.label = params$label
  if (!is.null(params$ref.label)) ref.label = sc_split(params$ref.label)
  params[["code"]] = params[["code"]] %n% unlist(knit_code$get(ref.label), use.names = FALSE)
  if (opts_knit$get('progress')) print(block)

  if (!is.null(params$child)) {
    if (!is_blank(params$code)) warning(
      "The chunk '", params$label, "' has the 'child' option, ",
      "and this code chunk must be empty. Its code will be ignored."
    )
    if (!params$eval) return('')
    cmds = lapply(sc_split(params$child), knit_child, options = block$params)
    out = paste(unlist(cmds), collapse = '\n')
    return(out)
  }

  params$code = parse_chunk(params$code) # parse sub-chunk references

  ohooks = opts_hooks$get()
  for (opt in names(ohooks)) {
    hook = ohooks[[opt]]
    if (!is.function(hook)) {
      warning("The option hook '", opt, "' should be a function")
      next
    }
    if (!is.null(params[[opt]])) params = as.strict_list(hook(params))
    if (!is.list(params))
      stop("The option hook '", opt, "' should return a list of chunk options")
  }

  # Check cache
  if (params$cache > 0) {
    content = c(
      params[if (params$cache < 3) cache1.opts else setdiff(names(params), cache0.opts)],
      getOption('width'), if (params$cache == 2) params[cache2.opts]
    )
    if (params$engine == 'R' && isFALSE(params$cache.comments)) {
      content[['code']] = parse_only(content[['code']])
    }
    hash = paste(valid_path(params$cache.path, label), digest::digest(content), sep = '_')
    params$hash = hash
    if (cache$exists(hash, params$cache.lazy) &&
        isFALSE(params$cache.rebuild) &&
        params$engine != 'Rcpp') {
      if (opts_knit$get('verbose')) message('  loading cache from ', hash)
      cache$load(hash, lazy = params$cache.lazy)
      if (!params$include) return('')
      if (params$cache == 3) return(cache$output(hash))
    }
    if (params$engine == 'R')
      cache$library(params$cache.path, save = FALSE) # load packages
  } else if (label %in% names(dep_list$get()) && !isFALSE(opts_knit$get('warn.uncached.dep')))
    warning2('code chunks must not depend on the uncached chunk "', label, '"')

  params$params.src = block$params.src
  opts_current$restore(params)  # save current options

  # set local options() for the current R chunk
  if (is.list(params$R.options)) {
    op = options(params$R.options); on.exit(options(op), add = TRUE)
  }

  block_exec(params)
}

# options that should affect cache when cache level = 1,2
cache1.opts = c('code', 'eval', 'cache', 'cache.path', 'message', 'warning', 'error')
# more options affecting cache level 2
cache2.opts = c('fig.keep', 'fig.path', 'fig.ext', 'dev', 'dpi', 'dev.args', 'fig.width', 'fig.height')
# options that should not affect cache
cache0.opts = c('include', 'out.width.px', 'out.height.px', 'cache.rebuild')

block_exec = function(options) {
  # when code is not R language
  if (options$engine != 'R') {
    res.before = run_hooks(before = TRUE, options)
    engine = get_engine(options$engine)
    output = in_dir(input_dir(), engine(options))
    res.after = run_hooks(before = FALSE, options)
    output = paste(c(res.before, output, res.after), collapse = '')
    output = knit_hooks$get('chunk')(output, options)
    if (options$cache) block_cache(
      options, output,
      if (options$engine == 'stan') options$engine.opts$x else character(0)
    )
    return(if (options$include) output else '')
  }

  # eval chunks (in an empty envir if cache)
  env = knit_global()
  obj.before = ls(globalenv(), all.names = TRUE)  # global objects before chunk

  keep = options$fig.keep
  keep.idx = NULL
  if (is.numeric(keep)) {
    keep.idx = keep
    keep = "index"
  }
  tmp.fig = tempfile(); on.exit(unlink(tmp.fig), add = TRUE)
  # open a device to record plots
  if (chunk_device(options$fig.width[1L], options$fig.height[1L], keep != 'none',
                   options$dev, options$dev.args, options$dpi, options, tmp.fig)) {
    # preserve par() settings from the last code chunk
    if (keep.pars <- opts_knit$get('global.par'))
      par2(opts_knit$get('global.pars'))
    showtext(options$fig.showtext)  # showtext support
    dv = dev.cur()
    on.exit({
      if (keep.pars) opts_knit$set(global.pars = par(no.readonly = TRUE))
      dev.off(dv)
    }, add = TRUE)
  }

  res.before = run_hooks(before = TRUE, options, env) # run 'before' hooks

  code = options$code
  echo = options$echo  # tidy code if echo
  if (!isFALSE(echo) && options$tidy && length(code)) {
    res = try_silent(do.call(
      formatR::tidy_source, c(list(text = code, output = FALSE), options$tidy.opts)
    ))
    if (!inherits(res, 'try-error')) {
      code = res$text.tidy
    } else warning('failed to tidy R code in chunk <', options$label, '>\n',
                   'reason: ', res)
  }
  # only evaluate certain lines
  if (is.numeric(ev <- options$eval)) {
    # group source code into syntactically complete expressions
    if (!options$tidy) code = sapply(highr:::group_src(code), paste, collapse = '\n')
    iss = seq_along(code)
    code = comment_out(code, '##', setdiff(iss, iss[ev]), newline = FALSE)
  }
  # guess plot file type if it is NULL
  if (keep != 'none' && is.null(options$fig.ext))
    options$fig.ext = dev2ext(options$dev)

  cache.exists = cache$exists(options$hash, options$cache.lazy)
  evaluate = knit_hooks$get('evaluate')
  # return code with class 'source' if not eval chunks
  res = if (is_blank(code)) list() else if (isFALSE(ev)) {
    as.source(code)
  } else if (cache.exists && isFALSE(options$cache.rebuild)) {
    fix_evaluate(cache$output(options$hash, 'list'), options$cache == 1)
  } else in_dir(
    input_dir(),
    evaluate(
      code, envir = env, new_device = FALSE,
      keep_warning = !isFALSE(options$warning),
      keep_message = !isFALSE(options$message),
      stop_on_error = if (options$error && options$include) 0L else 2L,
      output_handler = knit_handlers(options$render, options)
    )
  )
  if (options$cache %in% 1:2 && (!cache.exists || isTRUE(options$cache.rebuild))) {
    # make a copy for cache=1,2; when cache=2, we do not really need plots
    res.orig = if (options$cache == 2) remove_plot(res, keep == 'high') else res
  }

  # eval other options after the chunk
  if (!isFALSE(ev))
    for (o in opts_knit$get('eval.after'))
      options[o] = list(eval_lang(options[[o]], env))

  # remove some components according options
  if (isFALSE(echo)) {
    res = Filter(Negate(evaluate::is.source), res)
  } else if (is.numeric(echo)) {
    # choose expressions to echo using a numeric vector
    res = if (isFALSE(ev)) {
      as.source(code[echo])
    } else {
      filter_evaluate(res, echo, evaluate::is.source)
    }
  }
  if (options$results == 'hide') res = Filter(Negate(is.character), res)
  if (options$results == 'hold') {
    i = vapply(res, is.character, logical(1))
    if (any(i)) res = c(res[!i], merge_character(res[i]))
  }
  res = filter_evaluate(res, options$warning, evaluate::is.warning)
  res = filter_evaluate(res, options$message, evaluate::is.message)

  # rearrange locations of figures
  figs = find_recordedplot(res)
  if (length(figs) && any(figs)) {
    if (keep == 'none') {
      res = res[!figs] # remove all
    } else {
      if (options$fig.show == 'hold') res = c(res[!figs], res[figs]) # move to the end
      figs = find_recordedplot(res)
      if (length(figs) && sum(figs) > 1) {
        if (keep %in% c('first', 'last')) {
          res = res[-(if (keep == 'last') head else tail)(which(figs), -1L)]
        } else {
          # keep only selected
          if (keep == 'index') res = res[which(figs)[keep.idx]]
          # merge low-level plotting changes
          if (keep == 'high') res = merge_low_plot(res, figs)
        }
      }
    }
  }
  # number of plots in this chunk
  if (is.null(options$fig.num))
    options$fig.num = if (length(res)) sum(sapply(res, evaluate::is.recordedplot)) else 0L

  # merge neighbor elements of the same class into one element
  for (cls in c('source', 'message', 'warning')) res = merge_class(res, cls)

  if (isTRUE(options$fig.beforecode)) res = fig_before_code(res)

  on.exit({
    plot_counter(reset = TRUE)
    shot_counter(reset = TRUE)
  }, add = TRUE)  # restore plot number

  output = unlist(wrap(res, options)) # wrap all results together
  res.after = run_hooks(before = FALSE, options, env) # run 'after' hooks

  output = paste(c(res.before, output, res.after), collapse = '')  # insert hook results
  output = knit_hooks$get('chunk')(output, options)

  if (options$cache > 0) {
    # if cache.vars has been specifically provided, only cache these vars and no
    # need to look for objects in globalenv()
    obj.new = if (is.null(options$cache.vars)) setdiff(ls(globalenv(), all.names = TRUE), obj.before)
    copy_env(globalenv(), env, obj.new)
    objs = if (isFALSE(ev) || length(code) == 0) character(0) else
      options$cache.vars %n% codetools::findLocalsList(parse_only(code))
    # make sure all objects to be saved exist in env
    objs = intersect(c(objs, obj.new), ls(env, all.names = TRUE))
    if (options$autodep) {
      # you shall manually specify global object names if find_symbols() is not reliable
      cache$objects(
        objs, options$cache.globals %n% find_symbols(code), options$label,
        options$cache.path
      )
      dep_auto()
    }
    if (options$cache < 3) {
      if (options$cache.rebuild || !cache.exists) block_cache(options, res.orig, objs)
    } else block_cache(options, output, objs)
  }

  if (options$include) output else if (is.null(s <- options$indent)) '' else s
}

block_cache = function(options, output, objects) {
  hash = options$hash
  outname = cache_output_name(hash)
  assign(outname, output, envir = knit_global())
  purge_cache(options)
  cache$library(options$cache.path, save = TRUE)
  cache$save(objects, outname, hash, lazy = options$cache.lazy)
}

purge_cache = function(options) {
  # purge my old cache and cache of chunks dependent on me
  cache$purge(paste0(valid_path(
    options$cache.path, c(options$label, dep_list$get(options$label))
  ), '_????????????????????????????????'))
}

# open a device for a chunk; depending on the option global.device, may or may
# not need to close the device on exit
chunk_device = function(
  width, height, record = TRUE, dev, dev.args, dpi, options, tmp = tempfile()
) {
  dev_new = function() {
    # actually I should adjust the recording device according to dev, but here I
    # have only considered the png and tikz devices (because the measurement
    # results can be very different especially with the latter, see #1066), and
    # also the cairo_pdf device (#1235)
    if (identical(dev, 'png')) {
      do.call(grDevices::png, c(list(
        filename = tmp, width = width, height = height, units = 'in', res = dpi
      ), get_dargs(dev.args, 'png')))
    } else if (identical(dev, 'tikz')) {
      dargs = c(list(
        file = tmp, width = width, height = height
      ), get_dargs(dev.args, 'tikz'))
      dargs$sanitize = options$sanitize; dargs$standAlone = options$external
      if (is.null(dargs$verbose)) dargs$verbose = FALSE
      do.call(tikz_dev, dargs)
    } else if (identical(dev, 'cairo_pdf')) {
      do.call(grDevices::cairo_pdf, c(list(
        filename = tmp, width = width, height = height
      ), get_dargs(dev.args, 'cairo_pdf')))
    } else if (identical(getOption('device'), pdf_null)) {
      if (!is.null(dev.args)) {
        dev.args = get_dargs(dev.args, 'pdf')
        dev.args = dev.args[intersect(names(dev.args), c('pointsize', 'bg'))]
      }
      do.call(pdf_null, c(list(width = width, height = height), dev.args))
    } else dev.new(width = width, height = height)
  }
  if (!opts_knit$get('global.device')) {
    dev_new()
    dev.control(displaylist = if (record) 'enable' else 'inhibit')  # enable recording
    # if returns TRUE, we need to close this device after code is evaluated
    return(TRUE)
  } else if (is.null(dev.list())) {
    # want to use a global device but not open yet
    dev_new()
    dev.control('enable')
  }
  FALSE
}

# filter out some results based on the numeric chunk option as indices
filter_evaluate = function(res, opt, test) {
  if (length(res) == 0 || !is.numeric(opt) || !any(idx <- sapply(res, test)))
    return(res)
  idx = which(idx)
  idx = setdiff(idx, na.omit(idx[opt]))  # indices of elements to remove
  if (length(idx) == 0) res else res[-idx]
}

# find recorded plots in the output of evaluate()
find_recordedplot = function(x) {
  vapply(x, is_plot_output, logical(1))
}

is_plot_output = function(x) {
  evaluate::is.recordedplot(x) || inherits(x, 'knit_image_paths')
}

# move plots before source code
fig_before_code = function(x) {
  s = vapply(x, evaluate::is.source, logical(1))
  if (length(s) == 0 || !any(s)) return(x)
  s = which(s)
  f = which(find_recordedplot(x))
  f = f[f >= min(s)]  # only move those plots after the first code block
  for (i in f) {
    j = max(s[s < i])
    tmp = x[i]; x[[i]] = NULL; x = append(x, tmp, j - 1)
    s = which(vapply(x, evaluate::is.source, logical(1)))
  }
  x
}

# merge neighbor elements of the same class in a list returned by evaluate()
merge_class = function(res, class = c('source', 'message', 'warning')) {

  class = match.arg(class)
  idx = if (length(res)) which(sapply(res, inherits, what = class))
  if ((n <- length(idx)) <= 1) return(res)

  k1 = idx[1]; k2 = NULL; res1 = res[[k1]]
  el = c(source = 'src', message = 'message', warning = 'message')[class]
  for (i in 1:(n - 1)) {
    idx2 = idx[i + 1]; idx1 = idx[i]
    if (idx2 - idx1 == 1) {
      res2 = res[[idx2]]
      # merge warnings/messages only if next one is identical to previous one
      if (class == 'source' || identical(res1, res2) ||
          (class == 'message' && !grepl('\n$', tail(res1[[el]], 1)))) {
        res[[k1]][[el]] = c(res[[k1]][[el]], res2[[el]])
        k2 = c(k2, idx2)
      } else {
        k1 = idx2
        res1 = res[[k1]]
      }
    } else k1 = idx2
  }
  if (length(k2)) res = res[-k2] # remove lines that have been merged back
  res

}

# merge character output for output='hold', if the subsequent character is of
# the same class(es) as the previous one (e.g. should not merge normal
# characters with asis_output())
merge_character = function(res) {
  if ((n <- length(res)) <= 1) return(res)
  k = NULL
  for (i in 1:(n - 1)) {
    cls = class(res[[i]])
    if (identical(cls, class(res[[i + 1]]))) {
      res[[i + 1]] = paste0(res[[i]], res[[i + 1]])
      class(res[[i + 1]]) = cls
      k = c(k, i)
    }
  }
  if (length(k)) res = res[-k]
  res
}

call_inline = function(block) {
  if (opts_knit$get('progress')) print(block)
  in_dir(input_dir(), inline_exec(block))
}

inline_exec = function(block, envir = knit_global(), hook = knit_hooks$get('inline')) {

  # run inline code and substitute original texts
  code = block$code; input = block$input
  if ((n <- length(code)) == 0) return(input) # untouched if no code is found

  loc = block$location
  for (i in 1:n) {
    v = withVisible(eval(parse_only(code[i]), envir = envir))
    res = if (v$visible) knit_print(v$value, inline = TRUE, options = opts_chunk$get())
    if (inherits(res, 'knit_asis')) res = wrap(res, inline = TRUE)
    d = nchar(input)
    # replace with evaluated results
    stringr::str_sub(input, loc[i, 1], loc[i, 2]) = if (length(res)) {
      paste(hook(res), collapse = '')
    } else ''
    if (i < n) loc[(i + 1):n, ] = loc[(i + 1):n, ] - (d - nchar(input))
    # may need to move back and forth because replacement may be longer or shorter
  }
  input
}

process_tangle = function(x) {
  UseMethod('process_tangle', x)
}
#' @export
process_tangle.block = function(x) {
  params = opts_chunk$merge(x$params)
  for (o in c('purl', 'eval', 'child'))
    try(params[o] <- list(eval_lang(params[[o]])))
  if (isFALSE(params$purl)) return('')
  label = params$label; ev = params$eval
  if (params$engine != 'R') return(comment_out(knit_code$get(label)))
  code = if (!isFALSE(ev) && !is.null(params$child)) {
    cmds = lapply(sc_split(params$child), knit_child)
    paste(unlist(cmds), collapse = '\n')
  } else knit_code$get(label)
  # read external code if exists
  if (!isFALSE(ev) && length(code) && grepl('read_chunk\\(.+\\)', code)) {
    eval(parse_only(unlist(stringr::str_extract_all(code, 'read_chunk\\(([^)]+)\\)'))))
  }
  code = parse_chunk(code)
  if (isFALSE(ev)) code = comment_out(code, params$comment, newline = FALSE)
  if (opts_knit$get('documentation') == 0L) return(paste(code, collapse = '\n'))
  label_code(code, x$params.src)
}
#' @export
process_tangle.inline = function(x) {

  output = if (opts_knit$get('documentation') == 2L) {
    output = paste(line_prompt(x$input.src, "#' ", "#' "), collapse = '\n')
  } else ''

  code = x$code
  if (length(code) == 0L) return(output)

  if (getOption('knitr.purl.inline', FALSE)) output = c(output, code)

  idx = grepl('knit_child\\(.+\\)', code)
  if (any(idx)) {
    cout = sapply(code[idx], function(z) eval(parse_only(z)))
    output = c(output, cout, '')
  }

  paste(output, collapse = '\n')
}


# add a label [and extra chunk options] to a code chunk
label_code = function(code, label) {
  code = paste(c('', code, ''), collapse = '\n')
  paste0('## ----', stringr::str_pad(label, max(getOption('width') - 11L, 0L), 'right', '-'),
         '----', code)
}

as.source = function(code) {
  list(structure(list(src = code), class = 'source'))
}
knitr/R/utils-upload.R0000644000175100001440000000442413142522202014362 0ustar  hornikusers#' Upload an image to imgur.com
#'
#' This function uses the \pkg{RCurl} package to upload a image to
#' \url{imgur.com}, and parses the XML response to a list with \pkg{XML} which
#' contains information about the image in the Imgur website.
#'
#' When the output format from \code{\link{knit}()} is HTML or Markdown, this
#' function can be used to upload local image files to Imgur, e.g. set the
#' package option \code{opts_knit$set(upload.fun = imgur_upload)}, so the output
#' document is completely self-contained, i.e. it does not need external image
#' files any more, and it is ready to be published online.
#' @param file the path to the image file to be uploaded
#' @param key the client id for Imgur (by default uses a client id registered by
#'   Yihui Xie)
#' @return A character string of the link to the image; this string carries an
#'   attribute named \code{XML} which is a list converted from the response XML
#'   file; see Imgur API in the references.
#' @author Yihui Xie, adapted from the \pkg{imguR} package by Aaron Statham
#' @note Please register your own Imgur application to get your client id; you
#'   can certainly use mine, but this id is in the public domain so everyone
#'   has access to all images associated to it.
#' @references Imgur API version 3: \url{http://api.imgur.com/}; a demo:
#'   \url{https://yihui.name/knitr/demo/upload/}
#' @export
#' @examples \dontrun{
#' f = tempfile(fileext = '.png')
#' png(f); plot(rnorm(100), main = R.version.string); dev.off()
#'
#' res = imgur_upload(f)
#' res  # link to original URL of the image
#' attr(res, 'XML')  # all information
#' if (interactive()) browseURL(res)
#'
#' # to use your own key
#' opts_knit$set(upload.fun = function(file) imgur_upload(file, key = 'your imgur key'))
#' }
imgur_upload = function(file, key = '9f3460e67f308f6') {
  if (!is.character(key)) stop('The Imgur API Key must be a character string!')
  res = RCurl::postForm(
    'https://api.imgur.com/3/image.xml', image = RCurl::fileUpload(file),
    .opts = RCurl::curlOptions(httpheader = c(Authorization = paste('Client-ID', key)),
                               cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))
  )
  res = XML::xmlToList(res)
  if (is.null(res$link)) stop('failed to upload ', file)
  structure(res$link, XML = res)
}
knitr/R/themes.R0000644000175100001440000001235513142522202013227 0ustar  hornikusers#' Set or get theme to use for syntax highlighting
#' @noRd
#' @author Ramnath Vaidyanathan
set_theme = function(theme) {
  header = if (is.list(theme)) theme else theme_to_header(theme)
  opts_chunk$set(background = header$background)
  set_header(highlight = header$highlight)
  # par(col = theme$foreground)
}
get_theme = function(theme = NULL) {
  if (is.null(theme)) {
    theme_dir = system.file('themes', package = 'knitr')
    theme_files = list.files(theme_dir,  pattern = '\\.css$')
    gsub('\\.css$', '', basename(theme_files))
  } else {
    theme_to_header(theme)
  }
}

#' Syntax highlighting themes
#'
#' This object can be used to set or get themes in \pkg{knitr} for syntax
#' highlighting.
#'
#' We can use \code{knit_theme$set(theme)} to set the theme, and
#' \code{knit_theme$get(theme)} to get a theme. The \code{theme} is a character
#' string for both methods (either the name of the theme, or the path to the CSS
#' file of a theme), and for the \code{set()} method, it can also be a list
#' returned by the \code{get()} method. See examples below.
#' @author Ramnath Vaidyanathan and Yihui Xie
#' @references For a preview of all themes, see
#'   \url{https://gist.github.com/yihui/3422133}.
#' @note The syntax highlighting here only applies to \file{.Rnw} (LaTeX) and
#'   \file{.Rhtml} (HTML) documents, and it does not work for other types of
#'   documents, such as \file{.Rmd} (R Markdown, which has its own syntax
#'   highlighting themes; see \url{http://rmarkdown.rstudio.com}).
#' @export
#' @examples opts_knit$set(out.format='latex'); knit_theme$set('edit-vim')
#'
#' knit_theme$get()  # names of all available themes
#'
#' thm = knit_theme$get('acid')  # parse the theme to a list
#' knit_theme$set(thm)
#'
#' opts_knit$set(out.format=NULL) # restore option
knit_theme = list(set = set_theme, get = get_theme)


#' Generates header based on a theme and output format of document
#' @author Ramnath Vaidyanathan
#' @noRd
theme_to_header = function(theme, format = out_format()){
  if (format == 'latex') {
    theme_to_header_latex(theme)
  } else theme_to_header_html(theme)
}

#' Generates latex header based on a theme
#' @author Ramnath Vaidyanathan
#' @noRd
theme_to_header_latex = function(theme) {
  css_file = if (file.exists(theme)) theme else {
    system.file('themes', sprintf('%s.css', theme), package = 'knitr', mustWork = TRUE)
  }
  css_out = css.parser(css_file)

  # get background and foreground colors
  background = css_out$background$color
  foreground = css_out$std$color

  # write latex highlight header
  fgheader = color_def(foreground, 'fgcolor')
  highlight = paste(c(fgheader, styler_assistant_latex(css_out[-1])), collapse = '\n')
  list(highlight = highlight, background = background, foreground = foreground)
}

#' Generates css header based on a theme
#' @author Ramnath Vaidyanathan
#' @noRd
theme_to_header_html = function(theme){
  css_file = if (file.exists(theme)) theme else {
    system.file('themes', sprintf('%s.css', theme), package = 'knitr')
  }
  css = css.parser(css_file)
  bgcolor = css$background$color
  css_knitr = readLines(system.file('misc', 'knitr.css', package = 'knitr'))
  css_knitr[-2] = sub('^(\\s+background-color:\\s+)(.*)$', sprintf('\\1%s;', bgcolor), css_knitr[-2])
  css = c(css_knitr, gsub('^([.][a-z]{3} )', '.hl\\1', readLines(css_file)[-(1:3)]))
  list(highlight = paste(css, collapse = '\n'))
}

# parse a theme file from Highlight v3.x by Andre Simon to an R list of the form
# list(Colour = hex, Bold = TRUE, Italic = TRUE)
theme2list = function(theme.file) {
  y = readLines(theme.file, warn = FALSE)
  i = grep('^\\s*Description', y)
  if (i > 1) y = y[-seq_len(i - 1)]
  y = gsub('[{]', 'list(', y)
  y = gsub('[}]', ')', y)
  y = gsub(';', '', y)
  y = gsub('true', 'TRUE', y)
  y = paste(y, collapse = '\n')
  y = gsub(',\\s*)', ')', y)
  env = new.env()
  #cat(y, sep = '\n')
  eval(parse(text = y), envir = env)
  y = as.list(env)
  for (i in seq_along(y$Keywords)) {
    y[[paste0('Keyword', i)]] = y$Keywords[[i]]
  }
  y$Keywords = NULL
  y
}

# mapping between CSS class and Highlight theme elements
cls2thm = c(
  background = 'Canvas', num = 'Number', str = 'String', com = 'BlockComment',
  opt = 'Operator', std = 'Default',
  kwa = 'Keyword1', kwb = 'Keyword2', kwc = 'Keyword3', kwd = 'Keyword4'
)

# turn a list from theme2list() to CSS code
list2css = function(lst) {
  css = character(length(cls2thm))
  for (i in seq_along(cls2thm)) {
    m = cls2thm[i]; l = lst[[m]]
    # if not found, use the default style
    if (!is.list(l)) l = lst[['Default']]
    css[i] = paste(c(
      sprintf('.%s {', names(m)), sprintf('  color: %s;', l$Colour),
      sprintf('  font-weight: %s;', if (isTRUE(l$Bold)) 'bold'),
      sprintf('  font-style: %s;', if (isTRUE(l$Italic)) 'italic'), '}'
    ), collapse = '\n')
  }
  css
}

# generate CSS files for all themes in Andre Simon's Highlight package, e.g.
# themes2css('~/tmp/highlight/themes', '~/downloads/knitr/inst/themes')
themes2css = function(theme.path, css.path) {
  for (f in list.files(theme.path, pattern = '[.]theme$', full.names = TRUE)) {
    theme.name = sub('[.]theme$', '', basename(f))
    css.file = file.path(css.path, sprintf('%s.css', theme.name))
    writeLines(list2css(theme2list(f)), css.file)
    message('theme ', theme.name, ' saved to ', css.file)
  }
}
knitr/R/hooks-md.R0000644000175100001440000002001013142522202013446 0ustar  hornikusers#' @rdname hook_plot
#' @export
hook_plot_md = function(x, options) {
  # if not using R Markdown v2 or output is HTML, just return v1 output
  if (is.null(to <- pandoc_to()) || is_html_output(to))
    return(hook_plot_md_base(x, options))
  if (!is.null(options$out.width) || !is.null(options$out.height) ||
        !is.null(options$out.extra) || options$fig.align != 'default') {
    if (to %in% c('beamer', 'latex')) {
      # Pandoc < 1.13 does not support \caption[]{} so suppress short caption
      if (is.null(options$fig.scap)) options$fig.scap = NA
      return(hook_plot_tex(x, options))
    }
    if (to == 'docx') {
      warning('Chunk options fig.align, out.width, out.height, out.extra ',
              'are not supported for Word output')
      options$out.width = options$out.height = options$out.extra = NULL
      options$fig.align = 'default'
    }
  }
  if (options$fig.show == 'hold' && to == 'docx') {
    warning('The chunk option fig.show="hold" is not supported for Word output')
    options$fig.show = 'asis'
  }
  hook_plot_md_base(x, options)
}

# excludes can be a vector of 'markdown', 'epub', etc
is_html_output = function(fmt = pandoc_to(), excludes = NULL) {
  if (length(fmt) == 0) return(FALSE)
  if (grepl('^markdown', fmt)) fmt = 'markdown'
  if (fmt == 'epub3') fmt = 'epub'
  fmts = c('markdown', 'epub', 'html', 'html5', 'revealjs', 's5', 'slideous', 'slidy')
  fmt %in% setdiff(fmts, excludes)
}

hook_plot_md_base = function(x, options) {
  if (options$fig.show == 'animate') return(hook_plot_html(x, options))

  base = opts_knit$get('base.url') %n% ''
  cap = .img.cap(options)
  alt = .img.cap(options, alt = TRUE)

  w = options[['out.width']]; h = options[['out.height']]
  s = options$out.extra; a = options$fig.align
  ai = options$fig.show == 'asis'
  lnk = options$fig.link
  pandoc_html = cap != '' && is_html_output()
  in_bookdown = isTRUE(opts_knit$get('bookdown.internal.label'))
  plot1 = ai || options$fig.cur <= 1L
  plot2 = ai || options$fig.cur == options$fig.num
  if (is.null(w) && is.null(h) && is.null(s) && a == 'default' && !(pandoc_html && in_bookdown)) {
    # append  to ![]() to prevent the figure environment in these cases
    nocap = cap == '' && !is.null(to <- pandoc_to()) && !grepl('^markdown', to) &&
      (options$fig.num == 1 || ai) && !grepl('-implicit_figures', pandoc_from())
    res = sprintf('![%s](%s%s)', cap, base, .upload.url(x))
    if (!is.null(lnk) && !is.na(lnk)) res = sprintf('[%s](%s)', res, lnk)
    res = paste0(res, if (nocap) '' else '', if (is_latex_output()) ' ' else '')
    return(res)
  }
  add_link = function(x) {
    if (is.null(lnk) || is.na(lnk)) return(x)
    sprintf('%s', lnk, x)
  }
  # use HTML syntax 
  if (pandoc_html) {
    d1 = if (plot1) sprintf('
\n', css_text_align(a)) d2 = sprintf('

%s

', cap) img = sprintf( '%s', paste0(opts_knit$get('base.url'), .upload.url(x)), alt, .img.attr(w, h, s) ) img = add_link(img) # whether to place figure caption at the top or bottom of a figure if (isTRUE(options$fig.topcaption)) { paste0(d1, if (ai || options$fig.cur <= 1) d2, img, if (plot2) '
') } else { paste0(d1, img, if (plot2) paste0('\n', d2, '\n
')) } } else add_link(.img.tag( .upload.url(x), w, h, alt, c(s, sprintf('style="%s"', css_align(a))) )) } css_align = function(align) { sprintf('display: block; margin: %s;', switch( align, left = 'auto auto auto 0', center = 'auto', right = 'auto 0 auto auto' )) } css_text_align = function(align) { if (align == 'default') '' else sprintf(' style="text-align: %s"', align) } # helper function to manage HTML classes; turn "a b" to "{.a .b}" for Pandoc # fenced code blocks block_class = function(x){ if (length(x) == 0) return() classes = unlist(strsplit(x, '\\s+')) .classes = paste0('.', classes, collapse = ' ') paste0('{', .classes, '}') } #' @rdname output_hooks #' @export #' @param strict whether to use strict markdown or reST syntax; for markdown: if #' \code{TRUE}, code blocks will be indented by 4 spaces, otherwise they are #' put in fences made by three backticks; for reST, if \code{TRUE}, code is #' put under two colons and indented by 4 spaces, otherwise is put under the #' \samp{sourcecode} directive (e.g. it is useful for Sphinx) #' @param fence_char a single character to be used in the code blocks fence #' (e.g. it can be a backtick or a tilde, depending on your Markdown rendering #' engine) render_markdown = function(strict = FALSE, fence_char = '`') { set_html_dev() opts_knit$set(out.format = 'markdown') fence = paste(rep(fence_char, 3), collapse = '') # four spaces lead to

  hook.t = function(x, options, class = NULL) {
    # this code-block duplicated from hook.t()
    if (strict) {
      paste('\n', indent_block(x), '', sep = '\n')
    } else {
      x = paste(c('', x), collapse = '\n')
      r = paste0('\n', fence_char, '{3,}')
      if (grepl(r, x)) {
        l = attr(gregexpr(r, x)[[1]], 'match.length')
        l = max(l)
        if (l >= 4) fence = paste(rep(fence_char, l), collapse = '')
      }
      paste0('\n\n', fence, block_class(class), x, fence, '\n\n')
    }
  }
  hook.o = function(x, options) {
    hook.t(x, options, options$class.output)
  }
  hook.r = function(x, options) {
    language = tolower(options$engine)
    if (language == 'node') language = 'javascript'
    if (!options$highlight) language = 'text'
    if (!is.null(options$class.source)) {
      language = block_class(c(language, options$class.source))
    }
    paste0('\n\n', fence, language, '\n', x, fence, '\n\n')
  }
  knit_hooks$set(
    source = function(x, options) {
      x = hilight_source(x, 'markdown', options)
      (if (strict) hook.t else hook.r)(paste(c(x, ''), collapse = '\n'), options)
    },
    output = hook.o, warning = hook.t, error = hook.t, message = hook.t,
    inline = function(x) {
      fmt = pandoc_to()
      fmt = if (length(fmt) == 1L) 'latex' else 'html'
      .inline.hook(format_sci(x, fmt))
    },
    plot = hook_plot_md,
    chunk = function(x, options) {
      x = gsub(paste0('[\n]{2,}(', fence, '|    )'), '\n\n\\1', x)
      x = gsub('[\n]+$', '', x)
      x = gsub('^[\n]+', '\n', x)
      if (isTRUE(options$collapse)) {
        x = gsub(paste0('\n([', fence_char, ']{3,})\n+\\1(', tolower(options$engine), ')?\n'), "\n", x)
      }
      if (is.null(s <- options$indent)) return(x)
      line_prompt(x, prompt = s, continue = s)
    }
  )
}
#' @param highlight which code highlighting engine to use: for \code{pygments},
#'   the Liquid syntax is used (default approach Jekyll); for \code{prettify},
#'   the output is prepared for the JavaScript library \file{prettify.js}; for
#'   \code{none}, no highlighting engine will be used (code blocks are indented
#'   by 4 spaces)
#' @param extra extra tags for the highlighting engine; for \code{pygments}, it
#'   can be \code{'linenos'}; for \code{prettify}, it can be \code{'linenums'}
#' @rdname output_hooks
#' @export
render_jekyll = function(highlight = c('pygments', 'prettify', 'none'), extra = '') {
  hi = match.arg(highlight)
  render_markdown(TRUE)
  if (hi == 'none') return()
  switch(hi, pygments = {
    hook.r = function(x, options) {
      paste0(
        '\n\n{% highlight ', tolower(options$engine), if (extra != '') ' ', extra,
        ' %}\n', x, '\n{% endhighlight %}\n\n'
      )
    }
    hook.t = function(x, options) paste0(
      '\n\n{% highlight text %}\n', x, '{% endhighlight %}\n\n'
    )
  }, prettify = {
    hook.r = function(x, options) {
      paste0(
        '\n\n
', escape_html(x),
        '
\n\n' ) } hook.t = function(x, options) paste0( '\n\n
', escape_html(x), '
\n\n' ) }) knit_hooks$set(source = function(x, options) { x = paste(hilight_source(x, 'markdown', options), collapse = '\n') hook.r(x, options) }, output = hook.t, warning = hook.t, error = hook.t, message = hook.t) } knitr/R/hooks.R0000644000175100001440000000463013142522202013062 0ustar hornikusers# format a single inline object .inline.hook = function(x) { if (is.numeric(x)) x = round_digits(x) paste(as.character(x), collapse = ', ') } .out.hook = function(x, options) x .plot.hook = function(x, options) paste(x, collapse = '.') .default.hooks = list( source = .out.hook, output = .out.hook, warning = .out.hook, message = .out.hook, error = .out.hook, plot = .plot.hook, inline = .inline.hook, chunk = .out.hook, text = identity, evaluate = evaluate::evaluate, document = identity ) #' Hooks for R code chunks, inline R code and output #' #' A hook is a function of a pre-defined form (arguments) that takes values of #' arguments and returns desired output. The object \code{knit_hooks} is used to #' access or set hooks in this package. #' @export #' @references Usage: \url{https://yihui.name/knitr/objects/} #' #' Components in \code{knit_hooks}: \url{https://yihui.name/knitr/hooks/} #' @examples knit_hooks$get('source'); knit_hooks$get('inline') knit_hooks = new_defaults(.default.hooks) render_brew = function() NULL # the chunk option out.lines = n (first n rows), -n (last n rows), or c(n1, n2) # (first n1 and last n2 rows) hook_suppress = function(x, options) { n = options$out.lines if (length(n) == 0 || !is.numeric(n) || length(n) > 2) return(x) x = split_lines(x) m = length(x) if (length(n) == 1) { if (m > abs(n)) { x = if (n >= 0) c(head(x, n), '....') else c('....', tail(x, -n)) } } else { if (m > sum(n)) x = c(head(x, n[1]), '....', tail(x, n[2])) } paste(x, collapse = '\n') } #' Hooks for code chunk options #' #' Like \code{\link{knit_hooks}}, this object can be used to set hook functions #' to manipulate chunk options. #' #' For every code chunk, if the chunk option named, say, \code{FOO}, is not #' \code{NULL}, and a hook function with the same name has been set via #' \code{opts_hooks$set(FOO = function(options) { options })} (you can manipuate #' the \code{options} argument in the function and return it), the hook function #' will be called to update the chunk options. #' @references \url{https://yihui.name/knitr/hooks/} #' @export #' @examples # make sure the figure width is no smaller than fig.height #' opts_hooks$set(fig.width = function(options) { #' if (options$fig.width < options$fig.height) { #' options$fig.width = options$fig.height #' } #' options #' }) #' # remove all hooks #' opts_hooks$restore() opts_hooks = new_defaults(list()) knitr/R/utils-rd2html.R0000644000175100001440000001122313142522202014445 0ustar hornikusers#' Knit package documentation #' #' Run examples in a package and insert output into the examples code; #' \code{knit_rd_all()} is a wrapper around \code{knit_rd()} to build static #' HTML help pages for all packages under the \file{html} directory of them. #' @param pkg package name #' @param links a character vector of links to be passed to #' \code{\link[tools]{Rd2HTML}} #' @param frame whether to put a navigation frame on left of the index page #' @return All HTML pages corresponding to topics in the package are written #' under the current working directory. An \file{index.html} is also written #' as a table of content. #' @note Ideally the html pages should be put under the \file{html} directory of #' an installed package which can be found via \code{system.file('html', #' package = 'your_package_name')}, otherwise some links may not work (e.g. #' the link to the DESCRITION file). #' @examples library(knitr) #' \dontrun{ #' #' knit_rd('maps') #' knit_rd('rpart') #' setwd(system.file('html', package = 'ggplot2')) #' knit_rd('ggplot2') # time-consuming! #' #' knit_rd_all() # this may take really long time if you have many packages installed #' } #' @export knit_rd = function(pkg, links = tools::findHTMLlinks(), frame = TRUE) { library(pkg, character.only = TRUE) optc = opts_chunk$get(); on.exit(opts_chunk$set(optc)) file.copy(system.file('misc', 'R.css', package = 'knitr'), './') pkgRdDB = getFromNamespace('fetchRdDB', 'tools')(file.path(find.package(pkg), 'help', pkg)) force(links); topics = names(pkgRdDB) for (p in topics) { message('** knitting documentation of ', p) tools::Rd2HTML(pkgRdDB[[p]], f <- tempfile(), package = pkg, Links = links, no_links = is.null(links), stages = 'render') txt = readLines(f, warn = FALSE) unlink(f) if (length(i <- grep('

Examples

', txt)) == 1L && length(grep('', txt[i:length(txt)]))) { i0 = grep('
', txt); i0 = i0[i0 > i][1L] - 1L
      i1 = grep('
', txt); i1 = i1[i1 > i0][1L] + 1L tools::Rd2ex(pkgRdDB[[p]], ef <- tempfile()) ex = readLines(ef, warn = FALSE) unlink(ef) ex = ex[-(1L:grep('### ** Examples', ex, fixed = TRUE))] ex = c('```{r}', ex, '```') opts_chunk$set(fig.path = paste0('figure/', p, '-'), tidy = FALSE) res = try(knit2html(text = ex, envir = parent.frame(2), fragment.only = TRUE, quiet = TRUE)) if (inherits(res, 'try-error')) { res = ex; res[1] = '
'; res[length(res)] = '
' } txt = c(txt[1:i0], res, txt[i1:length(txt)]) txt = sub('', ' ', txt) } else message('no examples found for ', p) writeLines(txt, paste0(p, '.html')) } unlink('figure/', recursive = TRUE) toc = sprintf('- %s', paste0(topics, '.html'), topics) toc = c(paste0('# ', pkg), '', toc, '', paste('Generated with [knitr](https://yihui.name/knitr) ', packageVersion('knitr'))) markdown::markdownToHTML(text = paste(toc, collapse = '\n'), output = '00frame_toc.html', title = paste('R Documentation of', pkg), options = NULL, extensions = NULL, stylesheet = 'R.css') txt = readLines(file.path(find.package(pkg), 'html', '00Index.html')) unlink('00Index.html') # fix image links writeLines(gsub('../../../doc/html/', 'http://stat.ethz.ch/R-manual/R-devel/doc/html/', txt, fixed = TRUE), '00Index.html') if (!frame) { unlink(c('00frame_toc.html', 'index.html')) # do not need a navigation frame, so make 00Index the real homepage (if (is_windows()) file.copy else file.symlink)('00Index.html', 'index.html') return(invisible()) } writeLines(sprintf( ' Documentation of the %s package ', pkg), 'index.html') } #' @rdname knit_rd #' @export knit_rd_all = function() { owd = getwd(); on.exit(setwd(owd)) links = tools::findHTMLlinks() for (p in .packages(TRUE)) { message('* Making static html help pages for ', p) setwd(system.file('html', package = p)) knit_rd(p, links, frame = FALSE) } } knitr/R/hooks-textile.R0000644000175100001440000000243513142522202014537 0ustar hornikusers#' @rdname hook_plot #' @export hook_plot_textile = function(x, options) { cap = .img.cap(options); if (is.na(cap)) cap = '' tags = unlist(c(Map( sprintf, c('width: %s', 'height: %s'), options[c('out.width', 'out.height')] ), css_align(options$fig.align))) tags = if (length(tags)) sprintf('{%s}', paste(tags, collapse = ';')) else '' paste0( '!', tags, opts_knit$get('base.url'), .upload.url(x), if (nzchar(cap)) sprintf('(%s)', cap), '!\n\n', if (nzchar(cap)) sprintf('p(knitr plot caption#%s). %s', options$label, cap), '\n\n' ) } #' @rdname output_hooks #' @export render_textile = function() { set_html_dev() opts_knit$set(out.format = 'textile') textile.hook = function(name) { force(name) function(x, options) { if (name == 'source') x = c(hilight_source(x, 'textile', options), '') x = paste(x, collapse = '\n') sprintf('bc(knitr %s %s#%s).. %s\np(knitr_end). \n\n', tolower(options$engine), name, options$label, x) } } hook.inline = function(x) .inline.hook(format_sci(x, 'html')) z = list() for (i in c('source', 'warning', 'message', 'error')) z[[i]] = textile.hook(i) knit_hooks$set(z) knit_hooks$set( inline = hook.inline, output = textile.hook('output'), plot = hook_plot_textile ) } knitr/R/template.R0000644000175100001440000001341113142522202013547 0ustar hornikusers#' Automatically create a report based on an R script and a template #' #' This is a convenience function for small-scale automatic reporting based on #' an R script and a template. The default template is an Rnw file (LaTeX); #' \code{stitch_rhtml()} and \code{stitch_rmd()} are wrappers on top of #' \code{stitch()} using the R HTML and R Markdown templates respectively. #' #' The first two lines of the R script can contain the title and author of the #' report in comments of the form \samp{## title:} and \samp{## author:}. The #' template must have a token \samp{\%sCHUNK_LABEL_HERE}, which will be used to #' input all the R code from the script. See the examples below. #' #' The R script may contain chunk headers of the form \samp{## ---- label, #' opt1=val1, opt2=val2}, which will be copied to the template; if no chunk #' headers are found, the whole R script will be inserted into the template as #' one code chunk. #' @param script path to the R script #' @param template path of the template to use (by default the Rnw template in #' this package; there is also an HTML template in \pkg{knitr}) #' @param output the output filename (passed to \code{\link{knit}}); by default #' it uses the base filename of the script #' @inheritParams knit #' @return path of the output document #' @export #' @seealso \code{\link{spin}} (turn a specially formatted R script to a report) #' @examples s = system.file('misc', 'stitch-test.R', package = 'knitr') #' if (interactive()) stitch(s) # compile to PDF #' #' # HTML report #' stitch(s, system.file('misc', 'knitr-template.Rhtml', package = 'knitr')) #' #' # or convert markdown to HTML #' stitch(s, system.file('misc', 'knitr-template.Rmd', package = 'knitr')) stitch = function(script, template = system.file('misc', 'knitr-template.Rnw', package = 'knitr'), output = NULL, text = NULL, envir = parent.frame()) { lines = if (nosrc <- is.null(text)) readLines(script, warn = FALSE) else split_lines(text) # extract title and author from first two lines if (comment_to_var(lines[1L], '.knitr.title', '^#+ *title:', envir)) lines = lines[-1L] if (comment_to_var(lines[1L], '.knitr.author', '^#+ *author:', envir)) lines = lines[-1L] input = basename(template) input = sub_ext(basename(if (nosrc) script else tempfile()), file_ext(input)) txt = readLines(template, warn = FALSE) i = grep('%sCHUNK_LABEL_HERE', txt) if (length(i) != 1L) stop('Wrong template for stitch: ', template) h = sub('CHUNK_LABEL_HERE', '', txt[i]) j = grep(.sep.label, lines) if (length(j) == 0) { lines = c(sprintf(h, 'auto-report'), lines) } else { lines[j] = sprintf(h, gsub(.sep.label, '\\2', lines[j])) if (j[1] != 1L) lines = c(sprintf(h, ''), lines) } txt[i] = paste(lines, collapse = '\n') opts_chunk$set( fig.align = 'center', par = TRUE, fig.width = 6, fig.height = 6, fig.path = paste('figure', gsub('[^[:alnum:]]', '-', input), sep = '/') ) on.exit(opts_chunk$restore(), add = TRUE) knit_hooks$set(par = function(before, options, envir) { if (before) par(mar = c(4, 4, .1, .1), cex.lab = .95, cex.axis = .9, mgp = c(2, .7, 0), tcl = -.3, las = 1) }) on.exit(knit_hooks$restore(), add = TRUE) out = knit(input, output, envir = envir, text = txt) switch(file_ext(out), tex = { tools::texi2pdf(out, clean = TRUE) message('PDF output at: ', sub_ext(out, 'pdf')) }, md = { out.html = sub_ext(out, 'html') markdown::markdownToHTML(out, out.html) message('HTML output at: ', out.html) }) out } #' @rdname stitch #' @param ... arguments passed to \code{stitch()} #' @export stitch_rhtml = function(..., envir = parent.frame()) stitch( ..., envir = envir, template = system.file('misc', 'knitr-template.Rhtml', package = 'knitr') ) #' @rdname stitch #' @export stitch_rmd = function(..., envir = parent.frame()) stitch( ..., envir = envir, template = system.file('misc', 'knitr-template.Rmd', package = 'knitr') ) #' A simple macro preprocessor for templating purposes #' #' This function expands a template based on the R expressions in \code{{{}}} #' (this tag can be customized by the \code{delim} argument). These expressions #' are extracted, evaluated and replaced by their values in the original #' template. #' @param file the template file #' @param ... a list of variables to be used for the code in the template; note #' the variables will be searched in the parent frame as well #' @param text an alternative way to \code{file} to specify the template code #' directly (if provided, \code{file} will be ignored) #' @param delim the (opening and ending) delimiters for the templating tags #' @return A character vector, with the tags evaluated and replaced by their #' values. #' @references This function was inspired by the pyexpander and m4 #' (\url{http://www.gnu.org/software/m4/}), thanks to Frank Harrell. #' @export #' @examples # see the knit_expand vignette #' if (interactive()) browseVignettes(package='knitr') knit_expand = function(file, ..., text = readLines(file, warn = FALSE), delim = c('{{', '}}') ){ # check if delim is a pair, escaping regex as necessary if (length(delim) != 2L) stop('"delim" must be of length 2') delim = gsub('([.|()\\^{}+$*?]|\\[|\\])', '\\\\\\1', delim) delim = paste0(delim[1L], '((.|\n)+?)', delim[2L]) txt = paste(text, collapse = '\n') if (packageVersion('stringr') <= '0.9.0') delim = stringr::perl(delim) loc = stringr::str_locate_all(txt, delim)[[1L]] if (nrow(loc) == 0L) return(txt) # no match mat = stringr::str_extract_all(txt, delim)[[1L]] mat = sub(delim, '\\1', mat) env = list(...) env = if (length(env)) list2env(env, parent = parent.frame()) else parent.frame() inline_exec(list(code = mat, input = txt, location = loc), envir = env, hook = identity) } knitr/R/spin.R0000644000175100001440000001733513142522202012716 0ustar hornikusers#' Spin goat's hair into wool #' #' This function takes a specially formatted R script and converts it to a #' literate programming document. By default normal text (documentation) should #' be written after the roxygen comment (\code{#'}) and code chunk options are #' written after \code{#+} or \code{#-} or \code{# ----}. #' #' Obviously the goat's hair is the original R script, and the wool is the #' literate programming document (ready to be knitted). #' @param hair the path to the R script #' @param knit logical: whether to compile the document after conversion #' @param report logical: whether to generate report for \file{Rmd}, \file{Rnw} #' and \file{Rtex} output (ignored if \code{knit = FALSE}) #' @param text a character vector as an alternative way to \code{hair} to #' provide the R source; if \code{text} is not \code{NULL}, \code{hair} will #' be ignored #' @param envir the environment for \code{\link{knit}()} to evaluate the code #' @param format character: the output format (it takes five possible values); #' the default is R Markdown #' @param doc a regular expression to identify the documentation lines; by #' default it follows the roxygen convention, but it can be customized, e.g. #' if you want to use \code{##} to denote documentation, you can use #' \code{'^##\\\\s*'} #' @param inline a regular expression to identify inline R expressions; by #' default, code of the form \code{((code))} on its own line is treated as an #' inline expression #' @param comment a pair of regular expressions for the start and end delimiters #' of comments; the lines between a start and an end delimiter will be #' ignored; by default, the delimiters are \verb{/*} in the beginning and #' \verb{*/} in the end of a line (following the convention of C comments) #' @param precious logical: whether intermediate files (e.g., \code{.Rmd} files #' when \code{format} is \code{"Rmd"}) should be preserved; default #' \code{FALSE} if \code{knit == TRUE} and input is a file #' @author Yihui Xie, with the original idea from Richard FitzJohn (who named it #' as \code{sowsear()} which meant to make a silk purse out of a sow's ear) #' @return If \code{text} is \code{NULL}, the path of the final output document, #' otherwise the content of the output. #' @note If the output format is Rnw and no document class is specified in #' roxygen comments, this function will automatically add the \code{article} #' class to the LaTeX document so that it is complete and can be compiled. You #' can always specify the document class and other LaTeX settings in roxygen #' comments manually. #' #' When the output format is Rmd, it is compiled to HTML via #' \code{\link{knit2html}()}, which uses R Markdown v1 instead of v2. If you #' want to use the latter, you should call #' \code{rmarkdown::\link[rmarkdown]{render}()} instead. #' @export #' @seealso \code{\link{stitch}} (feed a template with an R script) #' @references \url{https://yihui.name/knitr/demo/stitch/} #' @examples #' write normal text like this and chunk options like below #' #' #+ label, opt=value #' #' # /* #' #' these lines are treated as comments in spin() #' 1+1 #' # */ #' #' (s = system.file('examples', 'knitr-spin.R', package = 'knitr')) #' spin(s) # default markdown #' o = spin(s, knit = FALSE) # convert only; do not make a purse yet #' knit2html(o) # compile to HTML #' #' # other formats #' spin(s, FALSE, format='Rnw') # you need to write documentclass after #' #' spin(s, FALSE, format='Rhtml') #' spin(s, FALSE, format='Rtex') #' spin(s, FALSE, format='Rrst') spin = function( hair, knit = TRUE, report = TRUE, text = NULL, envir = parent.frame(), format = c('Rmd', 'Rnw', 'Rhtml', 'Rtex', 'Rrst'), doc = "^#+'[ ]?", inline = '^[{][{](.+)[}][}][ ]*$', comment = c("^[# ]*/[*]", "^.*[*]/ *$"), precious = !knit && is.null(text) ) { format = match.arg(format) x = if (nosrc <- is.null(text)) readLines(hair, warn = FALSE) else split_lines(text) stopifnot(length(comment) == 2L) c1 = grep(comment[1], x); c2 = grep(comment[2], x) if (length(c1) != length(c2)) stop('comments must be put in pairs of start and end delimiters') # remove comments if (length(c1)) x = x[-unique(unlist(mapply(seq, c1, c2, SIMPLIFY = FALSE)))] p = .fmt.pat[[tolower(format)]] # turn ((expr)) into inline expressions, e.g. `r expr` or \Sexpr{expr} if (any(i <- grepl(inline, x))) x[i] = gsub(inline, p[4], x[i]) r = rle(grepl(doc, x) | i) # inline expressions are treated as doc instead of code n = length(r$lengths); txt = vector('list', n); idx = c(0L, cumsum(r$lengths)) p1 = gsub('\\{', '\\\\{', paste0('^', p[1L], '.*', p[2L], '$')) for (i in seq_len(n)) { block = x[seq(idx[i] + 1L, idx[i + 1])] txt[[i]] = if (r$values[i]) { # normal text; just strip #' sub(doc, '', block) } else { # R code; #+/- indicates chunk options block = strip_white(block) # rm white lines in beginning and end if (!length(block)) next if (length(opt <- grep('^#+(\\+|-| ----+| @knitr)', block))) { block[opt] = paste0(p[1L], gsub('^#+(\\+|-| ----+| @knitr)\\s*|-*\\s*$', '', block[opt]), p[2L]) } if (!grepl(p1, block[1L])) { block = c(paste0(p[1L], p[2L]), block) } c('', block, p[3L], '') } } txt = unlist(txt) # make it a complete TeX document if document class not specified if (report && format %in% c('Rnw', 'Rtex') && !grepl('^\\s*\\\\documentclass', txt)) { txt = c('\\documentclass{article}', '\\begin{document}', txt, '\\end{document}') } if (nosrc) { outsrc = sub_ext(hair, format) cat(txt, file = outsrc, sep = '\n') txt = NULL } else outsrc = NULL if (!knit) return(txt %n% outsrc) out = if (report) { if (format == 'Rmd') { knit2html(outsrc, text = txt, envir = envir) } else if (!is.null(outsrc) && (format %in% c('Rnw', 'Rtex'))) { knit2pdf(outsrc, envir = envir) } } else knit(outsrc, text = txt, envir = envir) if (!precious && !is.null(outsrc)) file.remove(outsrc) invisible(out) } .fmt.pat = list( rmd = c('```{r ', '}', '```', '`r \\1`'), rnw = c('<<', '>>=', '@', '\\\\Sexpr{\\1}'), rhtml = c('', ''), rtex = c('% begin.rcode ', '', '% end.rcode', '\\\\rinline{\\1}'), rrst = c('.. {r ', '}', '.. ..', ':r:`\\1`') ) #' Spin a child R script #' #' This function is similar to \code{\link{knit_child}()} but is used in R #' scripts instead. When the main R script is not called via #' \code{\link{spin}()}, this function simply executes the child script via #' \code{\link{sys.source}()}, otherwise it calls \code{\link{spin}()} to spin #' the child script into a source document, and uses \code{\link{knit_child}()} #' to compile it. You can call this function in R code, or using the syntax of #' inline R expressions in \code{\link{spin}()} (e.g. #' \code{{{knitr::spin_child('script.R')}}}). #' @param input the filename of the input R script #' @param format to be passed to \code{format} in \code{spin()}; if not #' provided, it will be guessed from the current knitting process #' @return A character string of the knitted R script. #' @export spin_child = function(input, format) { if (!isTRUE(getOption('knitr.in.progress'))) return(sys.source(input, parent.frame())) fmt = if (missing(format)) { if (is.null(fmt <- out_format())) stop('spin_child() must be called in a knitting process') .spin.fmt = c( 'latex' = 'Rnw', 'sweave' = 'Rnw', 'listings' = 'Rnw', 'html' = 'Rhtml', 'markdown' = 'Rmd' ) if (is.na(fmt <- .spin.fmt[fmt])) stop('the document format ', fmt, ' is not supported yet') fmt } else format asis_output(knit_child( text = spin(text = readLines(input), knit = FALSE, report = FALSE, format = fmt), quiet = TRUE )) } knitr/R/hooks-rst.R0000644000175100001440000000402013142522202013661 0ustar hornikusers# SET OF HOOKS FOR RESTRUCTURED TEXT --- #' @rdname hook_plot #' @export hook_plot_rst = function(x, options) { if (options$fig.show == 'animate') return(hook_plot_html(x, options)) cap = .img.cap(options) # TODO: add all options for figure # See http://docutils.sourceforge.net/docs/ref/rst/directives.html#image # http://docutils.sourceforge.net/docs/ref/rst/directives.html#figure make_directive( 'figure', paste0(opts_knit$get('base.url'), .upload.url(x)), c(align = if (options$fig.align == 'default') NULL else options$fig.align, alt = cap, width = options$out.width, height = options$out.height), cap ) } #' @rdname output_hooks #' @export render_rst = function(strict = FALSE) { set_html_dev() hook.s = function(x, options) { paste(c('\n\n::\n', indent_block(x), ''), collapse = '\n') } hook.t = function(x, options) { make_directive('sourcecode', tolower(options$engine), '', content = x) } hook.i = function(x) .inline.hook(format_sci(x, 'rst')) knit_hooks$set( source = function(x, options) { x = paste(c(hilight_source(x, 'rst', options), ''), collapse = '\n') (if (strict) hook.s else hook.t)(x, options) }, warning = hook.s, error = hook.s, message = hook.s, output = hook.s, inline = hook.i, plot = hook_plot_rst) } # Insert a reStructuredText directive for sphinx # # A reSt directive consists of a name, arguments, option and some content. # A typical reSt directive looks like this: # .. :: # :