Table des matières
Inclure une table des matières et spécifier (optionnellement) des sous-options de la TDM
- Inclure une table des matières, utiliser l’option
toc
toc_depth
pour spécifier le nombre de titres (3 par défaut)
toc_float
pour que la TDM soit toujours visible dans la marge gauche
collapsed
(TRUE
par défaut) pour déterminer si la table est étendue ou compacte par défaut (seulement titres visibles)
smooth_scroll
(TRUE
par défaut) détermine si la TDM défile en même temps que le défilement de la page
Titres numérotés
Numéroter les titres avec l’option number_sections
# (H1) = 1.
## (H2) = 1.1 (attention s'il n'y a pas de H1, ça donnera 0.1)
- Pour ne pas numéroter certains titres: ajouter
{-}
ou {.unnumbered}
après le titre
Styles/CSS
Appliquer des thèmes prédéfinis:
theme
: default, cerulean, journal, flatly, darkly, readable, spacelab, united, cosmo, lumen, paper, sandstone, simplex, yeti (null si on ne veut pas de thème, par ex si on veut utiliser son propre css)
highlight
: pour définir l’apparence de la syntaxe: tango, pygments, kate, monochrome, espresso, zenburn, haddock, textmate (ou option null
)
Voir theme gallery
Définir sa propre feuille CSS :
Appliquer des styles prédéfinis sur des blocs de résultats
- Personnaliser les blocs de code avec les options
class.source
et class.output
: classes CSS prédéfinies qu’on peut changer ou non: “bg-primary”, “bg-success”, “bg-info”, “bg-warning”, “bg-danger”
Code:
```{r class.output="bg-info"}
1 + 1
```
Résultat:
## [1] 2
Code:
```{r class.output="bg-danger"}
1 + 1
```
Résultat:
## [1] 2
Définir ses propres styles dans le fichier .rmd
- Définir le style pour une classe
resultat
:
- Assigner la classe
resultat
aux blocs avec l’option class.source
.
Code:
```{r class.source="resultat"}
mtcars[1:5, "mpg"]
```
Résultat:
## [1] 21.0 21.0 22.8 21.4 18.7
Fermer les blocs de code
Pour limiter la place que prennent les blocs de code, il possible de les “fermer” par défaut avec l’option code_fold
dans le champ html_document de l’entête ou de limiter la longueur avec un scroll dans css
Il n’est pas possible de plier seulement le résultat de code avec des options de blocs de code mais peut se faire avec du javascript. Il est toutefois possible de limiter la hauteur du bloc en ajoutant un déroulement avec les options attr.source
et attr.output
Code:
Résultat:
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
## [19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
## [37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
## [55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
## [73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
## [91] 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
## [109] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
## [127] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
## [145] 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
## [163] 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## [181] 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
## [199] 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
## [217] 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
## [235] 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
## [253] 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
## [271] 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
## [289] 289 290 291 292 293 294 295 296 297 298 299 300
Voir: https://bookdown.org/yihui/rmarkdown-cookbook/hook-scroll.html
Pour de bonnes modifs html: https://bookdown.org/yihui/rmarkdown-cookbook/custom-blocks.html
Blocs de code en appendice
- Par défaut les blocs de code et leurs résultats apparaissent à leur emplacement dans le texte, mais on peut ajouter tous les blocs de code à la fin du document en appendice en ajoutant un bloc de code avec les arguments
ref.label
et la fonction knitr::all_labels
.
- L’argument
echo = FALSE
devra être ajouté aux blocs de code.
code:
```{r ref.label=knitr::all_labels(), echo=TRUE, eval=FALSE}
```
Séparer le bloc des résultats
Présenter le résultat d’un bloc de codes ailleurs que directement dessous
- On présente le bloc de code
```{r graphique1, dev='png', fig.show='hide'}
plot(cars)
```
- Dans une autre section du document, on appel le résultat d’un bloc précédant avec la fonction
knitr::fig_chunk
et son label: (options_files/figure-html/graphique1-1.png)
```{r}
![Graphique provenant d'un bloc précédant](options_files/figure-html/graphique1-1.png)`
```
Téléchargement du fichier .rmd
Ajouter un bouton Code - Download .Rmd pour permettre le téléchargement du fichier R Markdown avec l’options code_download
dans le YAML
Tableaux
Par défaut R Markdown présente les tableaux comme dans la console R mais plusieurs options permettent de modifier leur mise en page.
La modification de tableaux peut être plus ou moins complexe et peut varier selon le format de sortie.
Façon la plus efficace de présenter un talbeau est avec la fonction knitr::kable() qui possède plusieurs arguments pour paramétrer la présentation de tableaux.
Voir aussi package kableExtra qui peut créer tableau pour html, pdf et word.
Peut inclure légende avec option caption =
Code:
```{r table-cars, results = "asis"}
knitr::kable(cars[1:5, ], caption = 'Un titre')
```
Résultat:
Un titre
4 |
2 |
4 |
10 |
7 |
4 |
7 |
22 |
8 |
16 |
Modifier la présentation des tableaux
- Option
df_print
dans le YAML pour paramétrer la présentation de tableaux pour les documents html_document
- Valeurs possibles: default, kable, tibble, paged (paginer les lignes de tableaux)
mtcars
Pour l’option paged
, plusieurs arguments peuvent être spécifiés dans chaque code chunk ( max.print, rows.print, cols.print, pages.print,rownames.print … )
Code:
```{r cols.print=3, rows.print=3}
mtcars
```
Résultats:
Citations et bibliographie
- Plusieurs façons d’insérer des citations mais la plus recommandée est d’utiliser de télécharger ses références dans un fichier BibTeX (.bib).
- Inclure ensuite dans l’entête l’argument bibliography dans le YAML et défini sa valeur avec le chemin vers le fichier BibTeX sur son poste.
- Pour changer le format des citations, télécharger le style (fichier csl) à partir de la liste de Zotero et l’inclure aussi dans le YAML.
Par défaut la bibliographie apparaitra à la fin du document, mais on peut forcer le déplacement des références en utilisant un div: <div id="refs"></div>
package citr
Après dans texte inclure [@Ref-1] ou [@ref-1; @ref-2; @ref-3] pour parenthèses ou @R-base pour référer à entrée dans le fichier. Pandoc va générer automatiquement une référence à la fin du document.
Pour inclure un titre dans la bibliographie qui n’a pas été citée dans le document, il faut définir un champ nocite dans l’entête
---
nocite: '@*'
---
---
nocite: |
@cit1, @cit2
---
Bibliographies and Citations
Document Word
Pour créer un document Word à partir de R Markdown, on spécifie le format word_document
dans l’entête YAML du document.
- On peut créer un template (style reference document) pour modifier la mise en page du document word.
- Ce template doit débuter par un document Rmd avec le format word_document.
- Ouvrir ensuite le document dans Word et modifier les styles et enregistrer sous un autre nom en fichier
.docx
pour ensuite l’ajouter dans le YAML.
Voir:
Bookdown
Dans RStudio: File -> New Project -> New Directory -> Book Project using bookdown
Créer pour rédiger de longs documents comme un livre à partir de plusieurs documents R Markdown où généralement chaque fichier est un chapitre.
Le premier document est généralement nommé index.Rmd et c’est le seul où se trouve le YAML.
Doit également trouver dans l’entête: site: bookdown::bookdown_site pour que rmarkdown sache qu’il faut utiliser bookdown pour construire tous les fichiers et pas seulement un fichier rmd.
Plusieurs formats de output peuvent être utilisés:
- bookdown::gitbook
- bookdown::pdf_book
- bookdown::word_document2
- bookdown::epub_book
Construit les fichier en appellant la fonction bookdown::render_book(‘index.Rmd’)
verbatim inline expression
`r 1+1`
Verbatim code chunks
```{r, eval=TRUE}
1 + 1
```
bloc gris texte noir
bloc gris texte vert
bloc blanc texte noir ``` # Titre non numéroté {-}
LS0tDQp0aXRsZTogIlJtYXJrZG93biAtIFBhcmFtw6l0cmFnZXMgdXRpbGVzIg0KYXV0aG9yOiAiQ2Fyb2xpbmUgUGF0ZW5hdWRlXltJbnN0aXR1dGlvbjogVW5pdmVyc2l0w6kgZGUgTW9udHLDqWFsLCBjYXJvbGluZS5wYXRlbmF1ZGVAdW1vbnRyZWFsLmNhXSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRoZW1lOiB5ZXRpDQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIFNtb290aF9zY3JvbGw6IGZhbHNlDQogICAgdG9jX2RlcHRoOiAzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCjxicj4NCg0KIyBUYWJsZSBkZXMgbWF0acOocmVzDQoNCkluY2x1cmUgdW5lIHRhYmxlIGRlcyBtYXRpw6hyZXMgZXQgc3DDqWNpZmllciAob3B0aW9ubmVsbGVtZW50KSBkZXMgc291cy1vcHRpb25zIGRlIGxhIFRETSANCg0KMS4gSW5jbHVyZSB1bmUgdGFibGUgZGVzIG1hdGnDqHJlcywgdXRpbGlzZXIgbCdvcHRpb24gYHRvY2AgDQoyLiBgdG9jX2RlcHRoYCBwb3VyIHNww6ljaWZpZXIgbGUgbm9tYnJlIGRlIHRpdHJlcyAoMyBwYXIgZMOpZmF1dCkNCjMuIGB0b2NfZmxvYXRgIHBvdXIgcXVlIGxhIFRETSBzb2l0IHRvdWpvdXJzIHZpc2libGUgZGFucyBsYSBtYXJnZSBnYXVjaGUgDQo0LiBgY29sbGFwc2VkYCAoYFRSVUVgIHBhciBkw6lmYXV0KSBwb3VyIGTDqXRlcm1pbmVyIHNpIGxhIHRhYmxlIGVzdCDDqXRlbmR1ZSBvdSBjb21wYWN0ZSBwYXIgZMOpZmF1dCAoc2V1bGVtZW50IHRpdHJlcyB2aXNpYmxlcykNCjUuIGBzbW9vdGhfc2Nyb2xsYCAoYFRSVUVgIHBhciBkw6lmYXV0KSBkw6l0ZXJtaW5lIHNpIGxhIFRETSBkw6lmaWxlIGVuIG3Dqm1lIHRlbXBzIHF1ZSBsZSBkw6lmaWxlbWVudCBkZSBsYSBwYWdlDQoNCg0KYGBgeWFtbA0KLS0tDQp0aXRsZTogIkV4ZW1wbGUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQotLS0NCmBgYA0KDQoqKioNCg0KPC9icj4NCg0KIyBUaXRyZXMgbnVtw6lyb3TDqXMNCg0KTnVtw6lyb3RlciBsZXMgdGl0cmVzIGF2ZWMgbCdvcHRpb24gYG51bWJlcl9zZWN0aW9uc2AgDQoNCmBgYHlhbWwNCi0tLQ0KdGl0bGU6ICJFeGVtcGxlIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KLS0tDQpgYGANCg0KYGBgDQojIChIMSkgID0gMS4NCiMjIChIMikgPSAxLjEgKGF0dGVudGlvbiBzJ2lsIG4neSBhIHBhcyBkZSBIMSwgw6dhIGRvbm5lcmEgMC4xKQ0KYGBgDQoNCi0gUG91ciBuZSBwYXMgbnVtw6lyb3RlciBjZXJ0YWlucyB0aXRyZXM6IGFqb3V0ZXIgYHstfWAgb3UgYHsudW5udW1iZXJlZH1gIGFwcsOocyBsZSB0aXRyZQ0KDQoNCioqKg0KDQo8L2JyPg0KDQojIFRyYW5zZm9ybWVyIGxlcyBzb3VzLXRpdHJlcyBlbiBvbmdsZXRzIA0KDQpBam91dGVyIGwnYXR0cmlidXQgYC50YWJzZXRgIGF1IHRpdHJlIHRyYW5zZm9ybWUgdG91cyBsZXMgc291cy10aXRyZXMgZW4gb25nbGV0cyBhdSBsaWV1IGRlIHNvdXMtc2VjdGlvbnMgKGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay9odG1sLXRhYnMuaHRtbCkNCg0KKipDb2RlOioqDQoNCmBgYG1hcmtkb3duDQojIyBFeGVtcGxlIGQnb25nbGV0cyB7LnRhYnNldH0NCg0KIyMjIE9uZ2xldCAxDQoNCkNvbnRlbnUgZGUgbCdvbmdsZXQgMQ0KDQojIyMgT25nbGV0IDINCg0KQ29udGVudSBkZSBsJ29uZ2xldCAyDQoNCiMjIHstfQ0KYGBgDQoNCi0gSWwgZXN0IGF1c3NpIHBvc3NpYmxlIGRlIHNww6ljaWZpZXIgMiBhdHRyaWJ1dHMgc3VwcGzDqW1lbnRhaXJlcyBwb3VyIGxlcyBvbmdsZXRzOiANCg0KMS4gYC50YWJzZXQtZmFkZWA6IGxlcyBvbmdsZXRzIHZvbnQgZGlzcGFyYWl0cmUgZXQgYXBwYXJhaXRyZSBlbiBzZSBkw6lwbGFjYW50IGRlIGwndW4gw6AgbCdhdXRyZQ0KMi4gYC50YWJzZXQtcGlsbHNgIGFwcGFyZW5jZSBkZXMgb25nbGV0cyBlbiAicGlsbCI6DQoNCmBgYG1hcmtkb3duDQojIyBRdWFydGVybHkgUmVzdWx0cyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCmBgYA0KDQotIFBvdXIgZmluaXIgdW4gdGFic2V0LCBjb21tZW5jZXIgdW4gbm91dmVhdSAqaGVhZGVyKiBkdSBuaXZlYXUgc3Vww6lyaWV1ciB2aWRlIHBvdXIgY29udGludWVyIGF2ZWMgZGVzIHBhcmFncmFwaGVzIHLDqWd1bGllcnMgDQoNCg0KKipSw6lzdWx0YXQ6KioNCg0KIyMgRXhlbXBsZSBkJ29uZ2xldHMgey50YWJzZXR9DQoNCiMjIyBPbmdsZXQgMQ0KDQpDb250ZW51IGRlIGwnb25nbGV0IDENCg0KIyMjIE9uZ2xldCAyDQoNCkNvbnRlbnUgZGUgbCdvbmdsZXQgMg0KDQojIyB7LX0NCg0KDQoqKioNCg0KPC9icj4NCg0KIyBNaXNlIGVuIGZvcm1lIGRlcyBncmFwaGlxdWVzDQoNClBsdXNpZXVycyBvcHRpb25zIHBvc3NpYmxlcyDDoCBpbmNsdXJlIGRhbnMgbGUgWUFNTDoNCg0KLSBgZmlnX3dpZHRoYCBldCAgYGZpZ19oZWlnaHRgOiA3eDUgcGFyIGTDqWZhdXQuDQoNCi0gYGZpZ19jYXB0aW9uYCA6IGzDqWdlbmRlIGRlcyBncmFwaGlxdWVzLg0KDQotIGBkZXZgOiBnZXN0aW9uIGRlcyBmb3JtYXRzIGRlIGdyYXBoaXF1ZXMgKGBwbmdgIHBhciBkw6lmYXV0KS4NCg0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiRXhlbXBsZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQogICAgZmlnX2NhcHRpb246IHRydWUNCi0tLQ0KYGBgDQpPcHRpb25zIGRlIG1pc2UgZW4gZm9ybWUgZGUgZ3JhcGhpcXVlcyBwZXV2ZW50IGF1c3NpIMOqdHJlIGluZGlxdcOpZXMgZGFucyBjaGFxdWUgYmxvYzogIA0KDQpgZmlnLndpZHRoPWAgZXQgYGZpZy5oZWlnaHQ9YCAoZW4gcG91Y2VzKSwgYG91dC53aWR0aD1gIGV0IGBvdXQuaGVpZ2h0PWAgKGVuICUpLCBgZmlnLmFsaWduPWAgKCdsZWZ0JywgJ2NlbnRlcicsIG9yICdyaWdodCcpLCBgZmlnLmNhcD0iImAgKGzDqWdlbmRlKSwgYGRldj1gIChvdXRpbCBncmFwaGlxdWUsICJwbmciIHBhciBkw6lmYXV0IG91IHN2ZyBvdSBqcGVnKS4NCg0KKipDb2RlOioqDQpgYGBgDQpgYGB7ciwgb3V0LndpZHRoPScyNSUnLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXA9J1VuZSBsw6lnZW5kZSd9YHIgJydgDQpwbG90KGNhcnMpDQpgYGANCmBgYGANCg0KKipSw6lzdWx0YXQ6KioNCmBgYHtyLCBvdXQud2lkdGg9JzI1JScsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0nVW5lIGzDqWdlbmRlJ30NCnBsb3QoY2FycykNCmBgYA0KDQoqKioNCg0KPC9icj4NCg0KIyBTdHlsZXMvQ1NTDQoNCiMjIEFwcGxpcXVlciBkZXMgdGjDqG1lcyBwcsOpZMOpZmluaXM6DQoNCi0gYHRoZW1lYCA6IGRlZmF1bHQsIGNlcnVsZWFuLCBqb3VybmFsLCBmbGF0bHksIGRhcmtseSwgcmVhZGFibGUsIHNwYWNlbGFiLCB1bml0ZWQsIGNvc21vLCBsdW1lbiwgcGFwZXIsIHNhbmRzdG9uZSwgc2ltcGxleCwgeWV0aSAobnVsbCBzaSBvbiBuZSB2ZXV0IHBhcyBkZSB0aMOobWUsIHBhciBleCBzaSBvbiB2ZXV0IHV0aWxpc2VyIHNvbiBwcm9wcmUgY3NzKQ0KDQotIGBoaWdobGlnaHRgIDogcG91ciBkw6lmaW5pciBsJ2FwcGFyZW5jZSBkZSBsYSBzeW50YXhlOiB0YW5nbywgcHlnbWVudHMsIGthdGUsIG1vbm9jaHJvbWUsIGVzcHJlc3NvLCB6ZW5idXJuLCBoYWRkb2NrLCB0ZXh0bWF0ZSAob3Ugb3B0aW9uIGBudWxsYCkgDQoNCltWb2lyIHRoZW1lIGdhbGxlcnldKGh0dHBzOi8vd3d3LmRhdGFkcmVhbWluZy5vcmcvcG9zdC9yLW1hcmtkb3duLXRoZW1lLWdhbGxlcnkvKQ0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiRXhlbXBsZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogdW5pdGVkDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KLS0tDQpgYGANCjwvYnI+DQoNCiMjIETDqWZpbmlyIHNhIHByb3ByZSBmZXVpbGxlICBDU1MgOg0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiRXhlbXBsZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogbnVsbA0KICAgIGhpZ2hsaWdodDogbnVsbA0KICAgIGNzczogc3R5bGVzLmNzcw0KLS0tDQpgYGANCg0KPC9icj4NCg0KIyMgQXBwbGlxdWVyIGRlcyBzdHlsZXMgcHLDqWTDqWZpbmlzIHN1ciBkZXMgYmxvY3MgZGUgcsOpc3VsdGF0cw0KDQotIFBlcnNvbm5hbGlzZXIgbGVzIGJsb2NzIGRlIGNvZGUgYXZlYyBsZXMgb3B0aW9ucyBgY2xhc3Muc291cmNlYCBldCBgY2xhc3Mub3V0cHV0YDogW2NsYXNzZXMgQ1NTIHByw6lkw6lmaW5pZXNdKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzMuNC9jc3MvI2hlbHBlci1jbGFzc2VzKSBxdSdvbiBwZXV0IGNoYW5nZXIgb3Ugbm9uOiAiYmctcHJpbWFyeSIsICJiZy1zdWNjZXNzIiwgImJnLWluZm8iLCAiYmctd2FybmluZyIsICJiZy1kYW5nZXIiDQoNCioqQ29kZToqKg0KYGBgYA0KYGBge3IgY2xhc3Mub3V0cHV0PSJiZy1pbmZvIn1gciAnJ2ANCjEgKyAxDQpgYGANCmBgYGANCg0KKipSw6lzdWx0YXQ6KioNCmBgYHtyIGNsYXNzLm91dHB1dD0iYmctaW5mbyJ9DQoxKzENCmBgYA0KDQoqKkNvZGU6KioNCmBgYGANCmBgYHtyIGNsYXNzLm91dHB1dD0iYmctZGFuZ2VyIn1gciAnJ2ANCjEgKyAxDQpgYGANCmBgYGANCioqUsOpc3VsdGF0OioqDQpgYGB7ciBjbGFzcy5vdXRwdXQ9ImJnLWRhbmdlciJ9DQoxKzENCmBgYA0KDQo8YnI+DQoNCiMjIETDqWZpbmlyIHNlcyBwcm9wcmVzIHN0eWxlcyBkYW5zIGxlIGZpY2hpZXIgLnJtZA0KDQoxLiBEw6lmaW5pciBsZSBzdHlsZSBwb3VyIHVuZSBjbGFzc2UgYHJlc3VsdGF0YDoNCg0KYGBgeWFtbA0KYGBge2NzcywgZWNobz1GQUxTRX0NCi5yZXN1bHRhdCB7DQogIGJhY2tncm91bmQtY29sb3I6IHJlZDsNCiAgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQpgYGANCmBgYA0KDQoyLiBBc3NpZ25lciBsYSBjbGFzc2UgYHJlc3VsdGF0YCBhdXggYmxvY3MgYXZlYyBsJ29wdGlvbiBgY2xhc3Muc291cmNlYC4NCg0KKipDb2RlOioqDQpgYGBgDQpgYGB7ciBjbGFzcy5zb3VyY2U9InJlc3VsdGF0In1gciAnJ2ANCm10Y2Fyc1sxOjUsICJtcGciXQ0KYGBgDQpgYGBgDQoqKlLDqXN1bHRhdDoqKg0KYGBge3IgY2xhc3Muc291cmNlPSJyZXN1bHRhdCJ9DQptdGNhcnNbMTo1LCAibXBnIl0NCmBgYA0KDQoNCioqKg0KDQo8L2JyPg0KDQojIEZlcm1lciBsZXMgYmxvY3MgZGUgY29kZQ0KDQpQb3VyIGxpbWl0ZXIgbGEgcGxhY2UgcXVlIHByZW5uZW50IGxlcyBibG9jcyBkZSBjb2RlLCBpbCBwb3NzaWJsZSBkZSBsZXMgImZlcm1lciIgcGFyIGTDqWZhdXQgYXZlYyBsJ29wdGlvbiBgY29kZV9mb2xkYCBkYW5zIGxlIGNoYW1wIGh0bWxfZG9jdW1lbnQgZGUgbCdlbnTDqnRlIG91IGRlIGxpbWl0ZXIgbGEgbG9uZ3VldXIgYXZlYyB1biBbc2Nyb2xsIGRhbnMgY3NzXShodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2svaHRtbC1zY3JvbGwuaHRtbCkNCg0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiRXhlbXBsZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KYGBgDQoNCklsIG4nZXN0IHBhcyBwb3NzaWJsZSBkZSBwbGllciBzZXVsZW1lbnQgbGUgcsOpc3VsdGF0IGRlIGNvZGUgYXZlYyBkZXMgb3B0aW9ucyBkZSBibG9jcyBkZSBjb2RlIG1haXMgcGV1dCBzZSBmYWlyZSBhdmVjIGR1IGphdmFzY3JpcHQuIElsIGVzdCB0b3V0ZWZvaXMgcG9zc2libGUgZGUgbGltaXRlciBsYSBoYXV0ZXVyIGR1IGJsb2MgZW4gYWpvdXRhbnQgdW4gZMOpcm91bGVtZW50IGF2ZWMgbGVzIG9wdGlvbnMgYGF0dHIuc291cmNlYCBldCBgYXR0ci5vdXRwdXRgDQoNCioqQ29kZToqKg0KYGBgYG1kDQpgYGB7ciwgYXR0ci5vdXRwdXQ9J3N0eWxlPSJtYXgtaGVpZ2h0OiAxMDBweDsiJ31gciAnJ2ANCjE6MzAwDQpgYGANCmBgYGANCg0KDQoqKlLDqXN1bHRhdDoqKg0KDQpgYGB7ciwgYXR0ci5vdXRwdXQ9J3N0eWxlPSJtYXgtaGVpZ2h0OiAxMDBweDsiJ30NCjE6MzAwDQpgYGANCg0KDQpWb2lyOiBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2svaG9vay1zY3JvbGwuaHRtbA0KDQpQb3VyIGRlIGJvbm5lcyBtb2RpZnMgaHRtbDogaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLWNvb2tib29rL2N1c3RvbS1ibG9ja3MuaHRtbA0KDQoqKioNCg0KPC9icj4NCg0KIyBCbG9jcyBkZSBjb2RlIGVuIGFwcGVuZGljZQ0KDQotIFBhciBkw6lmYXV0IGxlcyBibG9jcyBkZSBjb2RlIGV0IGxldXJzIHLDqXN1bHRhdHMgYXBwYXJhaXNzZW50IMOgIGxldXIgZW1wbGFjZW1lbnQgZGFucyBsZSB0ZXh0ZSwgbWFpcyBvbiBwZXV0IGFqb3V0ZXIgdG91cyBsZXMgYmxvY3MgZGUgY29kZSDDoCBsYSBmaW4gZHUgZG9jdW1lbnQgZW4gW2FwcGVuZGljZV0oaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLWNvb2tib29rL2NvZGUtYXBwZW5kaXguaHRtbCkgZW4gYWpvdXRhbnQgdW4gYmxvYyBkZSBjb2RlIGF2ZWMgbGVzIGFyZ3VtZW50cyBgcmVmLmxhYmVsYCBldCBsYSBmb25jdGlvbiBga25pdHI6OmFsbF9sYWJlbHNgLg0KLSBMJ2FyZ3VtZW50IGBlY2hvID0gRkFMU0VgIGRldnJhIMOqdHJlIGFqb3V0w6kgYXV4IGJsb2NzIGRlIGNvZGUuDQoNCioqY29kZToqKg0KYGBgYA0KYGBge3IgcmVmLmxhYmVsPWtuaXRyOjphbGxfbGFiZWxzKCksIGVjaG89VFJVRSwgZXZhbD1GQUxTRX1gciAnJ2ANCmBgYA0KYGBgYA0KDQoqKioNCg0KPC9icj4NCg0KIyBTw6lwYXJlciBsZSBibG9jIGRlcyByw6lzdWx0YXRzDQoNClByw6lzZW50ZXIgbGUgcsOpc3VsdGF0IGQndW4gYmxvYyBkZSBjb2RlcyBhaWxsZXVycyBxdWUgZGlyZWN0ZW1lbnQgZGVzc291cw0KDQotIE9uIHByw6lzZW50ZSBsZSBibG9jIGRlIGNvZGUNCg0KYGBgYA0KYGBge3IgZ3JhcGhpcXVlMSwgZGV2PSdwbmcnLCBmaWcuc2hvdz0naGlkZSd9YHIgJydgDQpwbG90KGNhcnMpDQpgYGANCmBgYGANCg0KLSBEYW5zIHVuZSBhdXRyZSBzZWN0aW9uIGR1IGRvY3VtZW50LCBvbiBhcHBlbCBsZSByw6lzdWx0YXQgZCd1biBibG9jIHByw6ljw6lkYW50IGF2ZWMgbGEgZm9uY3Rpb24gYGtuaXRyOjpmaWdfY2h1bmtgIGV0IHNvbiAqbGFiZWwqOiBgKGByIGtuaXRyOjpmaWdfY2h1bmsoJ2dyYXBoaXF1ZTEnLCAncG5nJylgKWANCg0KYGBgYA0KYGBge3J9YHIgJydgDQohW0dyYXBoaXF1ZSBwcm92ZW5hbnQgZCd1biBibG9jIHByw6ljw6lkYW50XShgciBrbml0cjo6ZmlnX2NodW5rKCdncmFwaGlxdWUxJywgJ3BuZycpYClgDQpgYGANCmBgYGANCg0KKioqDQoNCjwvYnI+DQoNCiMgVMOpbMOpY2hhcmdlbWVudCBkdSBmaWNoaWVyIC5ybWQNCg0KQWpvdXRlciB1biBib3V0b24gQ29kZSAtIERvd25sb2FkIC5SbWQgcG91ciBwZXJtZXR0cmUgbGUgdMOpbMOpY2hhcmdlbWVudCBkdSBmaWNoaWVyIFIgTWFya2Rvd24gYXZlYyBsJ29wdGlvbnMgYGNvZGVfZG93bmxvYWRgIGRhbnMgbGUgWUFNTA0KDQpgYGBgeWFtbA0KLS0tDQp0aXRsZTogIkV4ZW1wbGUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQpgYGBgDQoNCioqKg0KDQo8L2JyPg0KDQoNCiMgVGFibGVhdXgNCg0KLSBQYXIgZMOpZmF1dCBSIE1hcmtkb3duIHByw6lzZW50ZSBsZXMgdGFibGVhdXggY29tbWUgZGFucyBsYSBjb25zb2xlIFIgbWFpcyBwbHVzaWV1cnMgb3B0aW9ucyBwZXJtZXR0ZW50IGRlIG1vZGlmaWVyIGxldXIgbWlzZSBlbiBwYWdlLiANCi0gTGEgbW9kaWZpY2F0aW9uIGRlIHRhYmxlYXV4IHBldXQgw6p0cmUgcGx1cyBvdSBtb2lucyBjb21wbGV4ZSBldCBwZXV0IHZhcmllciBzZWxvbiBsZSBmb3JtYXQgZGUgc29ydGllLg0KLSBGYcOnb24gbGEgcGx1cyBlZmZpY2FjZSBkZSBwcsOpc2VudGVyIHVuIHRhbGJlYXUgZXN0IGF2ZWMgbGEgZm9uY3Rpb24gW2tuaXRyOjprYWJsZSgpXShodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2sva2FibGUuaHRtbCNrYWJsZS1mb3JtYXRzKSBxdWkgcG9zc8OoZGUgcGx1c2lldXJzIGFyZ3VtZW50cyBwb3VyIHBhcmFtw6l0cmVyIGxhIHByw6lzZW50YXRpb24gZGUgdGFibGVhdXguDQotIFZvaXIgYXVzc2kgW3BhY2thZ2Uga2FibGVFeHRyYV0oaHR0cHM6Ly9oYW96aHUyMzMuZ2l0aHViLmlvL2thYmxlRXh0cmEvKSBxdWkgcGV1dCBjcsOpZXIgdGFibGVhdSBwb3VyIGh0bWwsIHBkZiBldCB3b3JkLg0KDQotIFBldXQgaW5jbHVyZSBsw6lnZW5kZSBhdmVjIG9wdGlvbiBjYXB0aW9uID0gDQoNCioqQ29kZToqKg0KDQpgYGBgDQpgYGB7ciB0YWJsZS1jYXJzLCByZXN1bHRzID0gImFzaXMifWByICcnYA0Ka25pdHI6OmthYmxlKGNhcnNbMTo1LCBdLCBjYXB0aW9uID0gJ1VuIHRpdHJlJykNCmBgYA0KYGBgYA0KDQoqKlLDqXN1bHRhdDoqKg0KYGBge3IgdGFibGUtY2FycywgcmVzdWx0cyA9ICJhc2lzIn0NCmtuaXRyOjprYWJsZShjYXJzWzE6NSwgXSwgY2FwdGlvbiA9ICdVbiB0aXRyZScpDQpgYGANCg0KKioqDQoNCjwvYnI+DQoNCiMjIyBNb2RpZmllciBsYSBwcsOpc2VudGF0aW9uIGRlcyB0YWJsZWF1eA0KDQotIE9wdGlvbiBgZGZfcHJpbnRgIGRhbnMgbGUgWUFNTCBwb3VyIHBhcmFtw6l0cmVyIGxhIHByw6lzZW50YXRpb24gZGUgdGFibGVhdXggcG91ciBsZXMgZG9jdW1lbnRzIGBodG1sX2RvY3VtZW50YA0KLSBWYWxldXJzIHBvc3NpYmxlczogZGVmYXVsdCwga2FibGUsIHRpYmJsZSwgcGFnZWQgKHBhZ2luZXIgbGVzIGxpZ25lcyBkZSB0YWJsZWF1eCkNCg0KYGBgeWFtbA0KLS0tDQp0aXRsZTogIkV4ZW1wbGUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCmBgYA0KDQpgciAnJ2BgYGB7cn0NCm10Y2Fycw0KYGBgDQoNClBvdXIgbCdvcHRpb24gYHBhZ2VkYCwgcGx1c2lldXJzIGFyZ3VtZW50cyBwZXV2ZW50IMOqdHJlIHNww6ljaWZpw6lzIGRhbnMgY2hhcXVlIGNvZGUgY2h1bmsgKCBtYXgucHJpbnQsIHJvd3MucHJpbnQsIGNvbHMucHJpbnQsIHBhZ2VzLnByaW50LHJvd25hbWVzLnByaW50IC4uLiAgKQ0KDQoqKkNvZGU6KioNCmBgYGANCmBgYHtyIGNvbHMucHJpbnQ9Mywgcm93cy5wcmludD0zfWByICcnYA0KbXRjYXJzDQpgYGANCmBgYGANCioqUsOpc3VsdGF0czoqKg0KYGBge3IgY29scy5wcmludD0zLCByb3dzLnByaW50PTN9DQptdGNhcnMNCmBgYA0KDQoqKioNCg0KPC9icj4NCg0KIyBDaXRhdGlvbnMgZXQgYmlibGlvZ3JhcGhpZQ0KDQotIFBsdXNpZXVycyBmYcOnb25zIGQnaW5zw6lyZXIgZGVzIGNpdGF0aW9ucyBtYWlzIGxhIHBsdXMgcmVjb21tYW5kw6llIGVzdCBkJ3V0aWxpc2VyIGRlIHTDqWzDqWNoYXJnZXIgc2VzIHLDqWbDqXJlbmNlcyBkYW5zIHVuIGZpY2hpZXIgQmliVGVYICguYmliKS4gDQotIEluY2x1cmUgZW5zdWl0ZSBkYW5zIGwnZW50w6p0ZSBsJ2FyZ3VtZW50IGJpYmxpb2dyYXBoeSBkYW5zIGxlIFlBTUwgZXQgZMOpZmluaSBzYSB2YWxldXIgYXZlYyBsZSBjaGVtaW4gdmVycyBsZSBmaWNoaWVyIEJpYlRlWCBzdXIgc29uIHBvc3RlLiANCi0gUG91ciBjaGFuZ2VyIGxlIGZvcm1hdCBkZXMgY2l0YXRpb25zLCB0w6lsw6ljaGFyZ2VyIGxlIHN0eWxlIChmaWNoaWVyIGNzbCkgw6AgcGFydGlyIGRlIGxhIGxpc3RlIGRlIFtab3Rlcm9dKGh0dHBzOi8vd3d3LnpvdGVyby5vcmcvc3R5bGVzKSBldCBsJ2luY2x1cmUgYXVzc2kgZGFucyBsZSBZQU1MLg0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiRXhlbXBsZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCmJpYmxpb2dyYXBoeTogY2l0YXRpb25zLmJpYg0KY3NsOiBhcGEtNXRoLWVkaXRpb24uY3NsDQotLS0NCmBgYA0KDQotIFBhciBkw6lmYXV0IGxhIGJpYmxpb2dyYXBoaWUgYXBwYXJhaXRyYSDDoCBsYSBmaW4gZHUgZG9jdW1lbnQsIG1haXMgb24gcGV1dCBmb3JjZXIgbGUgZMOpcGxhY2VtZW50IGRlcyByw6lmw6lyZW5jZXMgZW4gdXRpbGlzYW50IHVuIGRpdjogYDxkaXYgaWQ9InJlZnMiPjwvZGl2PmANCg0KLSBwYWNrYWdlIGNpdHIgDQoNCi0gQXByw6hzIGRhbnMgdGV4dGUgaW5jbHVyZSBbQFJlZi0xXSBvdSBbQHJlZi0xOyBAcmVmLTI7IEByZWYtM10gcG91ciBwYXJlbnRow6hzZXMgb3UgQFItYmFzZSBwb3VyIHLDqWbDqXJlciDDoCBlbnRyw6llIGRhbnMgbGUgZmljaGllci4gUGFuZG9jIHZhIGfDqW7DqXJlciBhdXRvbWF0aXF1ZW1lbnQgdW5lIHLDqWbDqXJlbmNlIMOgIGxhIGZpbiBkdSBkb2N1bWVudC4NCg0KLSBQb3VyIGluY2x1cmUgdW4gdGl0cmUgZGFucyBsYSBiaWJsaW9ncmFwaGllIHF1aSBuJ2EgcGFzIMOpdMOpIGNpdMOpZSBkYW5zIGxlIGRvY3VtZW50LCBpbCBmYXV0IGTDqWZpbmlyIHVuIGNoYW1wIG5vY2l0ZSBkYW5zIGwnZW50w6p0ZQ0KDQpgYGBgDQotLS0NCm5vY2l0ZTogJ0AqJw0KLS0tDQoNCi0tLQ0Kbm9jaXRlOiB8DQogIEBjaXQxLCBAY2l0Mg0KLS0tDQpgYGBgDQoNCjxicj4NCltCaWJsaW9ncmFwaGllcyBhbmQgQ2l0YXRpb25zXShodHRwczovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9hdXRob3JpbmdfYmlibGlvZ3JhcGhpZXNfYW5kX2NpdGF0aW9ucy5odG1sKQ0KDQoqKioNCg0KPC9icj4NCg0KIyBUcmFuc2Zvcm1lciB1biBzY3JpcHQgZW4gcHLDqXNlbnRhdGlvbiAuUm1kDQoNCi0gSWwgZXN0IHBvc3NpYmxlIGRlIGfDqW7DqXJlciB1biBkb2N1bWVudCBkZSBwcsOpc2VudGF0aW9uIGRpcmVjdGVtZW50IMOgIHBhcnRpciBkJ3VuIGZpY2hpZXIgZGUgc2NyaXB0IFIgZGFucyBSU3R1ZGlvIGF2ZWMgbGEgZm9uY3Rpb24gYGtuaXRyOjpzcGluKClgIC0gKEN0cmwgLyBDbWQgKyBTaGlmdCArIEspLiANCi0gU29sdXRpb24gdXRpbGUgc2kgcGFzIGJlYXVjb3VwIGRlIHRleHRlIMOgIGFqb3V0ZXIgZGFucyBhbmFseXNlLg0KLSBJbCBmYXVkcmEgcGFyIGNvbnRyZSBhcHBsaXF1ZXIgdW5lIHN5bnRheGUgcGFydGljdWxpw6hyZSDDoCBzb24gZmljaGllciBkZSBzY3JpcHQuDQotIElsIGVzdCBhdXNzaSBwb3NzaWJsZSBkZSBmYWlyZSBsZSBjb250cmFpcmUgZXQgZGUgdHJhbnNmb3JtZXIgdW4gZG9jdW1lbnQgbWFya2Rvd24gZW4gc2NyaXB0IGF2ZWMgYGtuaXQ6OnB1cmxgLg0KDQo8YnI+DQoNCi0gVm9pciA6IGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay9zcGluLmh0bWwgDQotIFZvaXIgOiBodHRwczovL2RlYW5hdHRhbGkuY29tLzIwMTUvMDMvMjQva25pdHJzLWJlc3QtaGlkZGVuLWdlbS1zcGluLyANCg0KKioqDQoNCjwvYnI+DQoNCiMgRG9jdW1lbnQgV29yZA0KDQpQb3VyIGNyw6llciB1biBkb2N1bWVudCBXb3JkIMOgIHBhcnRpciBkZSBSIE1hcmtkb3duLCBvbiBzcMOpY2lmaWUgbGUgZm9ybWF0IGB3b3JkX2RvY3VtZW50YCBkYW5zIGwnZW50w6p0ZSBZQU1MIGR1IGRvY3VtZW50Lg0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiSGFiaXRzIg0KYXV0aG9yOiBKb2huIERvZQ0KZGF0ZTogTWFyY2ggMjIsIDIwMDUNCm91dHB1dDogDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgcmVmZXJlbmNlX2RvY3g6IG15LXN0eWxlcy5kb2N4DQotLS0NCmBgYA0KDQotIE9uIHBldXQgY3LDqWVyIHVuICp0ZW1wbGF0ZSogKihzdHlsZSByZWZlcmVuY2UgZG9jdW1lbnQqKSBwb3VyIG1vZGlmaWVyIGxhIG1pc2UgZW4gcGFnZSBkdSBkb2N1bWVudCB3b3JkLg0KLSBDZSB0ZW1wbGF0ZSBkb2l0IGTDqWJ1dGVyIHBhciB1biBkb2N1bWVudCBSbWQgYXZlYyBsZSBmb3JtYXQgd29yZF9kb2N1bWVudC4NCi0gT3V2cmlyIGVuc3VpdGUgbGUgZG9jdW1lbnQgZGFucyBXb3JkIGV0IG1vZGlmaWVyIGxlcyBzdHlsZXMgZXQgZW5yZWdpc3RyZXIgc291cyB1biBhdXRyZSBub20gZW4gZmljaGllciBgLmRvY3hgIHBvdXIgZW5zdWl0ZSBsJ2Fqb3V0ZXIgZGFucyBsZSBZQU1MLg0KDQoNClZvaXI6DQoNCi0gaHR0cHM6Ly92aW1lby5jb20vMTEwODA0Mzg3DQotIGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay93b3JkLXRlbXBsYXRlLmh0bWwNCi0gaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vYXJ0aWNsZXNfZG9jeC5odG1sDQoNCioqKg0KDQo8L2JyPg0KDQojIEJvb2tkb3duDQoNCi0gRGFucyBSU3R1ZGlvOiBGaWxlIC0+IE5ldyBQcm9qZWN0IC0+IE5ldyBEaXJlY3RvcnkgLT4gQm9vayBQcm9qZWN0IHVzaW5nIGJvb2tkb3duDQoNCi0gQ3LDqWVyIHBvdXIgcsOpZGlnZXIgZGUgbG9uZ3MgZG9jdW1lbnRzIGNvbW1lIHVuIGxpdnJlIMOgIHBhcnRpciBkZSBwbHVzaWV1cnMgZG9jdW1lbnRzIFIgTWFya2Rvd24gb8O5IGfDqW7DqXJhbGVtZW50IGNoYXF1ZSBmaWNoaWVyIGVzdCB1biBjaGFwaXRyZS4NCg0KLSBMZSBwcmVtaWVyIGRvY3VtZW50IGVzdCBnw6luw6lyYWxlbWVudCBub21tw6kgaW5kZXguUm1kIGV0IGMnZXN0IGxlIHNldWwgb8O5IHNlIHRyb3V2ZSBsZSBZQU1MLg0KDQotIERvaXQgw6lnYWxlbWVudCB0cm91dmVyIGRhbnMgbCdlbnTDqnRlOiBzaXRlOiBib29rZG93bjo6Ym9va2Rvd25fc2l0ZSBwb3VyIHF1ZSBybWFya2Rvd24gc2FjaGUgcXUnaWwgZmF1dCB1dGlsaXNlciBib29rZG93biBwb3VyIGNvbnN0cnVpcmUgdG91cyBsZXMgZmljaGllcnMgZXQgcGFzIHNldWxlbWVudCB1biBmaWNoaWVyIHJtZC4NCg0KLSBQbHVzaWV1cnMgZm9ybWF0cyBkZSBvdXRwdXQgcGV1dmVudCDDqnRyZSB1dGlsaXPDqXM6IA0KICAtIGJvb2tkb3duOjpnaXRib29rDQogIC0gYm9va2Rvd246OnBkZl9ib29rDQogIC0gYm9va2Rvd246OndvcmRfZG9jdW1lbnQyDQogIC0gYm9va2Rvd246OmVwdWJfYm9vaw0KDQpDb25zdHJ1aXQgbGVzIGZpY2hpZXIgZW4gYXBwZWxsYW50IGxhIGZvbmN0aW9uIGJvb2tkb3duOjpyZW5kZXJfYm9vaygnaW5kZXguUm1kJykNCg0KLSBbw4ljcmlyZSBzYSB0aMOoc2UgYXZlYyBib29rZG93bl0oaHR0cHM6Ly9lZGRqYmVycnkubmV0bGlmeS5jb20vcG9zdC93cml0aW5nLXlvdXItdGhlc2lzLXdpdGgtYm9va2Rvd24vKQ0KLSBbRXhlbXBsZXMgZGUgc2l0ZXMgd2ViIGF2ZWMgYmxvZ2Rvd25dKGh0dHBzOi8vZ2l0aHViLmNvbS9yYmluZCkNCg0KDQo8c3R5bGU+DQoucmVzdWx0YXQgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7DQogIGJvcmRlcjogM3B4IHNvbGlkIGJsdWU7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KPC9zdHlsZT4NCg0KDQp2ZXJiYXRpbSBpbmxpbmUgZXhwcmVzc2lvbg0KDQpgYCBgcg0KMSsxYCBgYA0KDQoNClZlcmJhdGltIGNvZGUgY2h1bmtzDQpgYGBgDQpgYGB7ciwgZXZhbD1UUlVFfWByICcnYA0KMSArIDENCmBgYA0KYGBgYA0KDQoNCmJsb2MgZ3JpcyB0ZXh0ZSBub2lyDQpgYGBtYXJrZG93bg0KIyBUaXRyZSBub24gbnVtw6lyb3TDqSB7LX0NCmBgYA0KYmxvYyBncmlzIHRleHRlIHZlcnQNCmBgYHlhbWwNCiMgVGl0cmUgbm9uIG51bcOpcm90w6kgey19DQpgYGANCmJsb2MgYmxhbmMgdGV4dGUgbm9pcg0KYGBgDQojIFRpdHJlIG5vbiBudW3DqXJvdMOpIHstfQ==