Caroline Patenaude
Bibliothécaire - Bibliothèque des lettres et sciences humaines

Script Colab | Script R


Télécharger et charger les packages utilisés


Gestion de packages

## R version 4.0.3 (2020-10-10)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 17763)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=French_Canada.1252  LC_CTYPE=French_Canada.1252   
## [3] LC_MONETARY=French_Canada.1252 LC_NUMERIC=C                  
## [5] LC_TIME=French_Canada.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## loaded via a namespace (and not attached):
##  [1] bookdown_0.22   digest_0.6.27   jsonlite_1.7.1  magrittr_2.0.1 
##  [5] evaluate_0.14   highr_0.8       rlang_0.4.9     stringi_1.5.3  
##  [9] rstudioapi_0.11 rmarkdown_2.8   distill_0.8     tools_4.0.3    
## [13] stringr_1.4.0   xfun_0.23       yaml_2.2.1      compiler_4.0.3 
## [17] htmltools_0.5.0 knitr_1.33


1. Les objets

## [1] 4


  • Mais l’intérêt du langage est que l’on stocke les valeurs, résultats, les tableaux, fonctions, … dans des objets qui pourront être réutilisés dans d’autres objets, fonctions, analyses.


## [1] 15.66667
## [1] 15.66667



Les noms d’objets:

  • Peuvent contenir des chiffres, lettres et caractères _ et .
  • Doivent commencer par une lettre, pas un chiffre.
  • Ne pas utiliser d’accents ni d’espace.
  • En principe il faut utiliser des noms significatifs, en pratique on utilise souvent des noms minimalistes pour faciliter la réutilisation.
  • Certains noms courts sont réservés (max, min, c, q, t, …).



Un objet est donc une boite dans laquelle on peut placer un chiffre, un mot, un jeu de données d’un million de répondants, une fonction, un graphique…


2. Les opérateurs

  • Opérateurs d’assignation: <-, = , ->
  • Opérateurs de sélection: [], [[]], $, :
  • Opérateurs booléen: !, &, |
  • Opérateurs arithmétiques: +, -, *, /, ^
  • Opérateurs de comparaison: ==, !=, <, >, <=, >=


3. Les fonctions

  • Permettent d’effectuer des tâches prédéfinies comme des analyses, graphiques, calculs, …
  • Chaque fonction a un nom et plusieurs fonctions peuvent permettre d’effectuer la même tâche: Par exemple pour faire une correlation, on retrouve les fonctions cor(), cor.test(), …
  • On appel une fonction en la nommant et on contrôle son comportement en paramétrant ses arguments
  • On peut imbriquer les fonctions les unes dans les autres avec des parenthèses.



## [1] 12 15 20 35 40
## [1] 24.4
## [1] 24


4. Les arguments

  • Chaque fonction possède une liste plus ou moins longue d’arguments (paramètres ou options) permettant de paramétrer son fonctionnement.
  • Certains arguments ont une valeur par défaut. Si ces valeurs nous conviennent, pas besoin de les indiquer.
  • Si l’argument n’a pas de valeur par défaut, FAUT le renseigner.
  • Pour modifier la valeur d’un argument, on le nomme et change sa valeur à la suite d’un =.
  • La liste d’arguments respecte un ordre. Si on modifie chaque argument dans l’ordre, on peut omettre le nom des arguments. Les arguments peuvent donc être nommés ou non (mais pour assurer la reproductibilité, il est recommandé de les nommer).
  • Le premier argument, toujours les données (on ne le nomme généralement pas x=)
  • Comment savoir quels sont les arguments d’une fonction? Taper Help(NomFonction) ou ?NomFonction .
## [1] NA
## [1] 47


5. Les types d’objets

  • Les objets sont caractérisés par différentes structures.
  • On retrouve 5 différents types de contenants ayant chacun leurs propriétés.


R Data Structures

  1. Vecteur
  2. Liste
  3. Matrice
  4. Arrays (3d)
  5. Dataframe (tableaux)


5.1. Vecteurs

  • La brique élémentaire = série de valeurs.
  • En pratique, c’est une variable (mais qui n’est pas dans un tableau) et ses éléments sont ses valeurs.
  • Objet contenant des valeurs (éléments/composantes) d’un seul mode: numérique, textuel, logique
  • On retrouve aussi des types dérivés comme les dates, les facteurs, les vecteurs labellisés qui ont des attributs particuliers.
## [1] "numeric"
## [1] 33.29370 25.39062 20.76125
## [1] 25.39062
## [1]  6.811842 -1.091231 -5.720611


5.2. Facteurs

  • Vecteur avec des attributs spécifiques, dont la structure correspond aux variables qualitatives.
  • Les modalités de la variable correspondent à des “niveaux” (levels) uniques et fixes, ie impossible d’assigner une valeur qui n’a pas été préalablement définie comme une des modalités.
  • Des étiquettes (labels) peuvent être associées aux niveaux.
  • Lors de l’importation de données, tout dépendant de la fonction d’importation, les variables qualitatives seront importées sous forme de vecteur textuel ou de facteur.
##  Factor w/ 2 levels "Homme","Femme": 2 2 1 2


5.3. Dataframes

  • Tableau de données pouvant regrouper des vecteurs de différents types (variables numériques et/ou textuelles).
  • Structurellement, le dataframe est une liste composées de vecteurs nommés (noms de variables uniques) de même longueur (nombre d’observations) mais qui peuvent être de modes différents (variables numériques, textuelles).
  • C’est donc un tableau avec des colonnes - ncol() et des lignes - nrow(), donc 2 dimensions - dim().
  • Crée un jeu de données avec la fonction data.frame(), mais on le crée rarement manuellement, généralement importé en format .txt, .csv, …
##    age sexe poids
## 1   45    H   150
## 2   65    F   125
## 3   22    F   210
## 4   38    H   175
## 5   54    H   110
## 6   31    F   180
## 7   29    F   130
## 8   44    H   155
## 9   56    F   190
## 10  67    H   120


5.4. Conclusion: Types d’objets et fonctions utiles

  • Les objets dans R sont caractérisés par différentes propriétés : ils possèdent au minimum un mode(), le type de base de ses composantes, et une longueur – length() - le nombre de composantes.

  • La fonction typeof() est très similaire au mode; elle offre une description un peu plus précise du format de stockage interne d’un objet.

  • Les objets ont aussi une classe() : c’est une propriété un peu plus complexe (issue du langage S) assignée à un objet pour définir l’information contenue ET déterminer la façon dont l’objet sera traité par certaines fonctions dites génériques, ie dont le résultat dépend dy type d’objet fourni (comme print(), summary(), plot()).

  • Bref, le mode, le type et la classe sont souvent pareils, mais pas toujours! La fonction str() peut aussi être utile pour plus de détails sur un objet et ses éléments.

  • Les objets, en plus de leurs composantes, peuvent aussi posséder des attributs - attributes() – métadonnées contenant des informations additionnelles sur l’objet comme des noms - names() (étiquettes des éléments) - et des dimensions - dim() (colonnes/lignes dans tableaux).

  • À noter:

    • Il est possible de convertir le type (mode) d’un objet avec: as.character(), as.list(), as.numeric(), as.factor().
    • Pour vérifier le format, remplacer as. par is : is.character(), is.list(), is.numeric(), is.factor(),



LS0tDQp0aXRsZTogIkNhcHN1bGUgMjogTGVzIG9iamV0cywgbGVzIGZvbmN0aW9ucyBldCBsZXVycyBhcmd1bWVudHMiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBoaWdobGlnaHQ6IGhhZGRvY2sNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgICAgU21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmNzczogaGlkZS5jc3MNCi0tLQ0KDQoNCkNhcm9saW5lIFBhdGVuYXVkZSA8YnI+IA0KKltCaWJsaW90aMOpY2FpcmUgLSBCaWJsaW90aMOocXVlIGRlcyBsZXR0cmVzIGV0IHNjaWVuY2VzIGh1bWFpbmVzXShodHRwczovL2JpYi51bW9udHJlYWwuY2EvZ3VpZGVzL2Rvbm5lZXMtc3RhdGlzdGlxdWVzLWdlb3NwYXRpYWxlcy9kb25uZWVzLXN0YXRpc3RpcXVlcykqIA0KPGJyPg0KDQpbU2NyaXB0IENvbGFiXShodHRwczovL2dpdGh1Yi5jb20vQ291cnMtRURVbGliL0ZBUy1JU0RTL2Jsb2IvbWFpbi9tb2R1bGUtMy8zLTRfbGVzX29iamV0cy5pcHluYikgfCBbU2NyaXB0IFJdKGh0dHBzOi8vZ2l0aHViLmNvbS9Db3Vycy1FRFVsaWIvRkFTLUlTRFMvYmxvYi9tYWluL21vZHVsZS0zLzMuNC1sZXMtb2JqZXRzLlIpIA0KDQo8YnI+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCjxkaXYgY2xhc3M9ImZvbGQgbyI+DQoNCioqVMOpbMOpY2hhcmdlciBldCBjaGFyZ2VyIGxlcyBwYWNrYWdlcyB1dGlsaXPDqXMqKiAgICANCg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgVG91am91cnMgZMOpYnV0ZXIgc29uIHNjcmlwdCBwYXIgbGUgY29kZSBkJ2luc3RhbGxhdGlvbiBkZXMgcGFja2FnZXMgbsOpY2Vzc2FpcmVzLg0KDQojIERhbnMgQ29sYWIsIHRvdXMgbGVzIHBhY2thZ2VzIHNvbnQgdMOpbMOpY2hhcmfDqXMgZGFucyBsJ2Vudmlyb25uZW1lbnQgZCdleMOpY3V0aW9uIHN1ciBsZSBudWFnZSwgDQojIGMnZXN0IHBvdXJxdW9pIGlsIGZhdXQgbGVzIHTDqWzDqWNoYXJnZXIgZXQgbGVzIGNoYXJnZXIgw6AgY2hhcXVlIGZvaXMuDQoNCiMgQ2V0dGUgw6l0YXBlIHBldXQgcHJlbmRyZSBwbHVzaWV1cnMgbWludXRlcy4NCg0KIyDDgCBOT1RFUiwgcHVpc3F1ZSBxdSdpbCBlc3QgcHLDqWbDqXJhYmxlIGRlIG5lIHBhcyBpbmNsdXJlIGxlIGNvZGUgZGUgdMOpbMOpY2hhcmdlbWVudCANCiMgZGVzIG1vZHVsZXMgZGFucyB1biBkb2N1bWVudCBSbWFya2Rvd24sIHNldWxzIGxlcyBjb2RlcyBkZSBjaGFyZ2VtZW50IG9udCDDqXTDqSBpbmRpcXXDqXM6DQpsaWJyYXJ5KCJxdWVzdGlvbnIiKQ0KDQojIExlcyBjb21tYW5kZXMgZGUgdMOpbMOpY2hhcmdlbWVudCBkZXZyb250IGRvbmMgw6p0cmUgYWpvdXTDqWVzIMOgIHNvbiBkb2N1bWVudCBDb2xhYiBvdSBSbWFya2Rvd246DQppbnN0YWxsLnBhY2thZ2VzKCJwYWNrYWdlIiwgZGVwZW5kZW5jaWVzPVRSVUUpDQoNCiMgZGVwZW5kZW5jaWVzPVRSVUU6IGFzc3VyZSBxdWUgdG91cyBsZXMgbW9kdWxlcyBkw6lwZW5kYW50cyBuw6ljZXNzYWlyZXMgc2Vyb250IGF1c3NpIGluc3RhbGzDqXMuDQpgYGANCg0KPGJyPg0KDQoqKkdlc3Rpb24gZGUgcGFja2FnZXMqKiAgDQoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojIyBWb2lyIGxlcyBtb2R1bGVzIHTDqWzDqWNoYXJnw6lzIChjaGFyZ8OpcyBvdSBub24pDQppbnN0YWxsZWQucGFja2FnZXMoKQkNCmBgYA0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMjIFZvaXIgbGVzIG1vZHVsZXMgY2hhcmfDqXMNCnNlYXJjaCgpDQpgYGANCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojIyBMaXN0ZXIgbGVzIGZvbmN0aW9ucyBkJ3VuIG1vZHVsZSBjaGFyZ8OpDQpsaWJyYXJ5KGhlbHAgPSBxdWVzdGlvbnIpDQpgYGANCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojIyBEw6l0YWNoZXIgdW4gbW9kdWxlIGNoYXJnw6kNCmRldGFjaChwYWNrYWdlOk5vbU1vZHVsZSkgICAgICMgcG91ciDDqXZpdGVyIGxlcyBjb25mbGl0cyBlbnRyZSBmb25jdGlvbnMgZHUgbcOqbWUgbm9tDQpgYGANCg0KYGBge3J9DQojIERvY3VtZW50ZXIgbGVzIGTDqXRhaWxzIGRlIHNvbiBlbnZpcm9ubmVtZW50IGRlIHRyYXZhaWwgKHN5c3TDqG1lLCBwYWNrYWdlcywgdmVyc2lvbnMuLi4pDQpzZXNzaW9uSW5mbygpICMgSW1wb3J0YW50IMOgIG5vdGVyIHBvdXIgYXNzdXJlciBsYSByZXByb2R1Y3RpYmlsaXTDqSBkZXMgYW5hbHlzZXMNCmBgYA0KDQoNCjxicj4NCg0KIyMgMS4gTGVzIG9iamV0cyAgDQoNCg0KYGBge3J9DQojIFIgY29tbWUgdW5lIGdyb3NzZSBjYWxjdWxhdHJpY2UNCg0KMiArIDIgIyBsZXMgZXNwYWNlcyBuJ29udCBwYXMgZCdpbXBhY3QNCmBgYA0KDQoNCjxicj4NCiANCiogTWFpcyBs4oCZaW50w6lyw6p0IGR1IGxhbmdhZ2UgZXN0IHF1ZSBs4oCZb24gc3RvY2tlIGxlcyB2YWxldXJzLCByw6lzdWx0YXRzLCBsZXMgdGFibGVhdXgsIGZvbmN0aW9ucywg4oCmIGRhbnMgZGVzICpvYmpldHMqIHF1aSBwb3Vycm9udCDDqnRyZSByw6l1dGlsaXPDqXMgZGFucyBk4oCZYXV0cmVzIG9iamV0cywgZm9uY3Rpb25zLCBhbmFseXNlcy4gIA0KDQoNCjxicj4gIA0KDQoNCiFbXShtYXJrZG93bi9hc3NpZ25hdGlvbi5qcGcpe3dpZHRoPTgwJX0NCg0KDQoNCg0KYGBge3J9DQojIENhbGN1bCBzaW1wbGUNCigxMisxNSsyMCkvMyANCmBgYA0KDQpgYGB7cn0NCiMjIENyw6llciB1biBvYmpldCBlbiB1dGlsaXNhbnQgbCdvcMOpcmF0ZXVyIGQnYXNzaWduYXRpb24gIjwtIiBwb3VyIHN0b2NrZXIgbGUgcsOpc3VsdGF0IGR1IGNhbGN1bA0KbW95ZW5uZSA8LSAoMTIrMTUrMjApLzMgDQpgYGANCg0KYGBge3J9DQojIyBQb3VyIHZvaXIgbGUgY29udGVudSBkZSBzb24gb2JqZXQsIHRhcHBlciBzb24gbm9tDQoNCm1veWVubmUgICMgVXRpbGlzYXRpb24gaW1wbGljaXRlIGRlIGxhIGZvbmN0aW9uIHByaW50KCkgDQpgYGANCg0KPGJyPg0KDQoNCiFbXShtYXJrZG93bi9vYmpldC5qcGcpe3dpZHRoPTgwJX0NCg0KPGJyPg0KDQoqKkxlcyBub21zIGTigJlvYmpldHMqKjoNCg0KLSBQZXV2ZW50IGNvbnRlbmlyIGRlcyBjaGlmZnJlcywgbGV0dHJlcyBldCBjYXJhY3TDqHJlcyBfIGV0IC4NCi0gRG9pdmVudCBjb21tZW5jZXIgcGFyIHVuZSBsZXR0cmUsIHBhcyB1biBjaGlmZnJlLg0KLSBOZSBwYXMgdXRpbGlzZXIgZOKAmWFjY2VudHMgbmkgZOKAmWVzcGFjZS4NCi0gRW4gcHJpbmNpcGUgaWwgZmF1dCB1dGlsaXNlciBkZXMgbm9tcyBzaWduaWZpY2F0aWZzLCBlbiBwcmF0aXF1ZSBvbiB1dGlsaXNlIHNvdXZlbnQgZGVzIG5vbXMgbWluaW1hbGlzdGVzIHBvdXIgZmFjaWxpdGVyIGxhIHLDqXV0aWxpc2F0aW9uLg0KLSBDZXJ0YWlucyBub21zIGNvdXJ0cyBzb250IHLDqXNlcnbDqXMgKG1heCwgbWluLCBjLCBxLCB0LCDigKYpLg0KDQo8YnI+ICANCg0KDQohW10obWFya2Rvd24vYm9pdGUzLnBuZyl7d2lkdGg9NjAlfQ0KDQo8YnI+DQogIA0KKipVbiBvYmpldCBlc3QgZG9uYyB1bmUgYm9pdGUgZGFucyBsYXF1ZWxsZSBvbiBwZXV0IHBsYWNlciB1biBjaGlmZnJlLCB1biBtb3QsIHVuIGpldSBkZSBkb25uw6llcyBkJ3VuIG1pbGxpb24gZGUgcsOpcG9uZGFudHMsIHVuZSBmb25jdGlvbiwgdW4gZ3JhcGhpcXVlLi4uKiogIA0KDQoNCjxicj4NCg0KDQojIyAyLiBMZXMgb3DDqXJhdGV1cnMgIA0KDQoNCg0KKiAgT3DDqXJhdGV1cnMgZCdhc3NpZ25hdGlvbjogKio8LSoqLCA9ICwgLT4NCiogIE9ww6lyYXRldXJzIGRlIHPDqWxlY3Rpb246IFtdLCBbW11dLCAkLCA6DQoqICBPcMOpcmF0ZXVycyBib29sw6llbjogISwgJiwgfA0KKiAgT3DDqXJhdGV1cnMgYXJpdGhtw6l0aXF1ZXM6ICssIC0sICosIC8sIF4NCiogIE9ww6lyYXRldXJzIGRlIGNvbXBhcmFpc29uOiA9PSwgIT0sIDwsID4sIDw9LCA+PSANCg0KPGJyPg0KDQojIyAzLiBMZXMgZm9uY3Rpb25zICANCg0KDQoqICBQZXJtZXR0ZW50IGTigJllZmZlY3R1ZXIgZGVzIHTDomNoZXMgcHLDqWTDqWZpbmllcyBjb21tZSBkZXMgYW5hbHlzZXMsIGdyYXBoaXF1ZXMsIGNhbGN1bHMsIOKApiANCiogIENoYXF1ZSBmb25jdGlvbiBhIHVuIG5vbSBldCBwbHVzaWV1cnMgZm9uY3Rpb25zIHBldXZlbnQgcGVybWV0dHJlIGQnZWZmZWN0dWVyIGxhIG3Dqm1lIHTDomNoZTogUGFyIGV4ZW1wbGUgcG91ciBmYWlyZSB1bmUgY29ycmVsYXRpb24sIG9uIHJldHJvdXZlIGxlcyBmb25jdGlvbnMgY29yKCksIGNvci50ZXN0KCksIC4uLg0KKiAgT24gYXBwZWwgdW5lIGZvbmN0aW9uIGVuIGxhIG5vbW1hbnQgZXQgb24gY29udHLDtGxlIHNvbiBjb21wb3J0ZW1lbnQgZW4gcGFyYW3DqXRyYW50IHNlcyBhcmd1bWVudHMNCiogIE9uIHBldXQgaW1icmlxdWVyIGxlcyBmb25jdGlvbnMgbGVzIHVuZXMgZGFucyBsZXMgYXV0cmVzIGF2ZWMgZGVzIHBhcmVudGjDqHNlcy4NCg0KPGJyPiAgDQoNCg0KIVtdKG1hcmtkb3duL2ZvbmN0aW9uLmpwZyl7d2lkdGg9ODAlfQ0KDQoNCjxicj4gIA0KDQoNCmBgYHtyfQ0KIyBDcsOpZXIgdW4gbm91dmVsIG9iamV0IG5vbW3DqSAiYWdlIiBjb21wb3PDqSBk4oCZdW5lIHPDqXJpZSBkZSA1IG5vbWJyZXMgYXZlYyBsYSBmb25jdGlvbiBjKCkgKGNvbmNhdMOpbmVyKQ0KYWdlIDwtIGMoMTIsIDE1LCAyMCwgMzUsIDQwKSANCmBgYA0KDQpgYGB7cn0NCiMgUG91ciB2b2lyIGxlIG5vbSBkJ3VuIG9iamV0LCBvbiB0YXBwZSBzb24gbm9tDQphZ2UNCmBgYA0KDQpgYGB7cn0NCiMgUGFzc2VyIGNldCBvYmpldCBjb21tZSAxZXIgYXJndW1lbnQgZGUgbGEgZm9uY3Rpb24gbWVhbigpDQptZWFuKGFnZSkNCmBgYA0KDQpgYGB7cn0NCiMgQXJyb25kaXIgbGUgcsOpc3VsdGF0IHNhbnMgZMOpY2ltYWxlIChhcmd1bWVudCBkaWdpdHM9KSBlbiBpbWJyaXF1YW50IGxhIGZvbmN0aW9uIG1lYW4oKSBkYW5zIGxhIGZvbmN0aW9uIHJvdW5kKCkNCnJvdW5kKG1lYW4oYWdlKSwgZGlnaXRzPTApIA0KYGBgDQoNCjxicj4NCg0KIyMgNC4gTGVzIGFyZ3VtZW50cyAgDQoNCg0KKiBDaGFxdWUgZm9uY3Rpb24gcG9zc8OoZGUgdW5lIGxpc3RlIHBsdXMgb3UgbW9pbnMgbG9uZ3VlIGTigJlhcmd1bWVudHMgKHBhcmFtw6h0cmVzIG91IG9wdGlvbnMpIHBlcm1ldHRhbnQgZGUgcGFyYW3DqXRyZXIgc29uIGZvbmN0aW9ubmVtZW50Lg0KKiBDZXJ0YWlucyBhcmd1bWVudHMgb250IHVuZSB2YWxldXIgcGFyIGTDqWZhdXQuIFNpIGNlcyB2YWxldXJzIG5vdXMgY29udmllbm5lbnQsIHBhcyBiZXNvaW4gZGUgbGVzIGluZGlxdWVyLg0KKiBTaSBs4oCZYXJndW1lbnQgbuKAmWEgcGFzIGRlIHZhbGV1ciBwYXIgZMOpZmF1dCwgRkFVVCBsZSByZW5zZWlnbmVyLg0KKiBQb3VyIG1vZGlmaWVyIGxhIHZhbGV1ciBk4oCZdW4gYXJndW1lbnQsIG9uIGxlIG5vbW1lIGV0IGNoYW5nZSBzYSB2YWxldXIgw6AgbGEgc3VpdGUgZOKAmXVuID0uDQoqIExhIGxpc3RlIGTigJlhcmd1bWVudHMgcmVzcGVjdGUgdW4gb3JkcmUuIFNpIG9uIG1vZGlmaWUgY2hhcXVlIGFyZ3VtZW50IGRhbnMgbOKAmW9yZHJlLCBvbiBwZXV0IG9tZXR0cmUgbGUgbm9tIGRlcyBhcmd1bWVudHMuIExlcyBhcmd1bWVudHMgcGV1dmVudCBkb25jIMOqdHJlIG5vbW3DqXMgb3Ugbm9uIChtYWlzIHBvdXIgYXNzdXJlciBsYSByZXByb2R1Y3RpYmlsaXTDqSwgaWwgZXN0IHJlY29tbWFuZMOpIGRlIGxlcyBub21tZXIpLg0KKiBMZSBwcmVtaWVyIGFyZ3VtZW50LCB0b3Vqb3VycyBsZXMgZG9ubsOpZXMgKG9uIG5lIGxlIG5vbW1lIGfDqW7DqXJhbGVtZW50IHBhcyB4PSkNCiogQ29tbWVudCBzYXZvaXIgcXVlbHMgc29udCBsZXMgYXJndW1lbnRzIGTigJl1bmUgZm9uY3Rpb24/IFRhcGVyIEhlbHAoTm9tRm9uY3Rpb24pIG91ID9Ob21Gb25jdGlvbiAuDQoNCmBgYHtyfQ0KYWdlIDwtIGMoMjUsIDM2LCA0NywgNTgsIDY5LCBOQSkgICMgSmUgY3LDqcOpIHVuIHZlY3RldXIgY29tcG9zw6kgZGUgNSBjaGlmZnJlcyBldCB1bmUgdmFsZXVyIG1hbnF1YW50ZQ0KDQojIMOAIG5vdGVyOiBsb3JzcXVlIGwnb24gc3RvY2tlIHVuIG5vdXZlYXUgY29udGVudSBkYW5zIHVuICBvYmpldCBleGlzdGFudCwgbGUgY29udGVudSBpbml0aWFsIGVzdCDDqWNyYXPDqQ0KYGBgDQoNCmBgYHtyfQ0KbWVhbihhZ2UpICAgICMgT1VQUyENCmBgYA0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCmhlbHAobWVhbikgICMgUG91ciBhZmZpY2hlciBsJ2FpZGUgZCd1bmUgZm9uY3Rpb24gKG91ID9tZWFuKQ0KYGBgDQoNCmBgYHtyfQ0KbWVhbihhZ2UsIG5hLnJtPVRSVUUpDQoNCiMgTCdhcmd1bWVudCBuYS5ybT1UUlVFIGluZGlxdWUgZGUgbmUgcGFzIHByZW5kcmUgZW4gY29tcHRlIGxlcyB2YWxldXJzIG1hbnF1YW50ZXMNCiMgTCdhcmd1bWVudCB0cmltPS4wNSBpbmRpcXVlIGQnZXhjbHVyZSBsZXMgNSUgbGVzIHBsdXMgZXh0csOqbWVzDQpgYGANCg0KPGJyPg0KDQojIyA1LiBMZXMgdHlwZXMgZCdvYmpldHMgIA0KDQoNCi0gTGVzIG9iamV0cyBzb250IGNhcmFjdMOpcmlzw6lzIHBhciAqKmRpZmbDqXJlbnRlcyBzdHJ1Y3R1cmVzKiouDQotIE9uIHJldHJvdXZlICoqNSBkaWZmw6lyZW50cyB0eXBlcyBkZSBjb250ZW5hbnRzKiogYXlhbnQgY2hhY3VuIGxldXJzIHByb3ByacOpdMOpcy4gDQoNCjxicj4gICANCg0KDQpbIVtSIERhdGEgU3RydWN0dXJlc10obWFya2Rvd24vdHlwZXMuanBnKXt3aWR0aD03MCV9XShodHRwczovL2Rldm9wZWRpYS5vcmcvci1kYXRhLXN0cnVjdHVyZXMpIA0KDQoxLiAgICoqVmVjdGV1cioqDQoyLiAgIExpc3RlDQozLiAgIE1hdHJpY2UNCjQuICAgQXJyYXlzICgzZCkNCjUuICAgKipEYXRhZnJhbWUgKHRhYmxlYXV4KSoqDQoNCg0KPGJyPiAgDQoNCg0KIyMjIDUuMS4gVmVjdGV1cnMgIA0KDQoNCiogIExhIGJyaXF1ZSDDqWzDqW1lbnRhaXJlID0gc8OpcmllIGRlIHZhbGV1cnMuDQoqICBFbiBwcmF0aXF1ZSwgY+KAmWVzdCB1bmUgdmFyaWFibGUgKG1haXMgcXVpIG7igJllc3QgcGFzIGRhbnMgdW4gdGFibGVhdSkgZXQgc2VzIMOpbMOpbWVudHMgc29udCBzZXMgdmFsZXVycy4NCiogIE9iamV0IGNvbnRlbmFudCBkZXMgdmFsZXVycyAow6lsw6ltZW50cy9jb21wb3NhbnRlcykgZCd1biBzZXVsICoqbW9kZSoqOiBudW3DqXJpcXVlLCB0ZXh0dWVsLCBsb2dpcXVlIA0KKiAgT24gcmV0cm91dmUgYXVzc2kgZGVzIHR5cGVzIGTDqXJpdsOpcyBjb21tZSBsZXMgZGF0ZXMsIGxlcyAqKmZhY3RldXJzKiosIGxlcyB2ZWN0ZXVycyBsYWJlbGxpc8OpcyBxdWkgb250IGRlcyAqKmF0dHJpYnV0cyoqIHBhcnRpY3VsaWVycy4NCg0KYGBge3J9DQojIE9uIGNyw6llIGRlcyB2ZWN0ZXVycyBwcmluY2lwYWxlbWVudCBhdmVjIGxhIGNvbW1hbmRlIGMoKQ0KDQpwb2lkcyA8LSBjKDcwLCA2NSwgNjApICAjIHZlY3RldXIgbnVtw6lyaXF1ZSAoKSAtIGZvcm1hdCBxdWkgc2UgZMOpY2xpbmUgZGUgZmHDp29uIHBsdXMgZMOpdGFpbGzDqWUgKCJudW1lcmljIiwgZG91YmxlIiwgImludGVnZXIiLCAuLi4pDQpzZXhlIDwtIGMoImZlbW1lIiwgImhvbW1lIiwgImZlbW1lIikgICMgdmVjdGV1ciB0ZXh0dWVsIChlbnRyZSBndWlsbGVtZXRzIHNpbXBsZXMgb3UgZG91YmxlcykNCnRhaWxsZSA8LSBjKFRSVUUsIEZBTFNFLCBGQUxTRSwgVFJVRSkgICMgdmVjdGV1ciBib29sw6llbiAtIHBldXQgdXRpbGlzZXIgbGVzIHJhY2NvdXJjaXMgVC9GDQpgYGANCg0KYGBge3J9DQojIFBvdXIgdm9pciBsZSAiZm9ybWF0IiBkZXMgw6lsw6ltZW50cyBzdG9ja8OpcyBkYW5zIHVuIG9iamV0LCB1dGlsaXNlciBsYSBmb25jdGlvbiBtb2RlKCkgb3UgdHlwZW9mKCkNCg0KbW9kZShwb2lkcykNCmBgYA0KDQpgYGB7cn0NCiMgT24gcGV1dCBmYWlyZSBkZXMgY2FsY3VscyBlbnRyZSB2ZWN0ZXVycyAtIGV4ZW1wbGUsIGNhbGN1bCBkZSBsJ0lNQzogcG9pZHMgZGl2aXPDqSBwYXIgdGFpbGxlIGF1IGNhcnLDqSANCg0KcG9pZHMgPC0gYyg3MCwgNjUsIDYwKSAjIGNyw6llIHVuIHZlY3RldXIgbm9tbcOpICJwb2lkcyIgYXZlYyBsYSBmb25jdGlvbiBjKCkgY29tcG9zw6kgZGUgMyDDqWzDqW1lbnRzIG51bcOpcmlxdWVzDQpgYGANCg0KYGBge3J9DQp0YWlsbGUgPC0gYygxLjQ1LCAxLjYwLCAxLjcwKSBeIDIgICMgY3LDqWUgdW4gdmVjdGV1ciBub21tw6kgInRhaWxsZSIgYXZlYyBsYSBmb25jdGlvbiBjKCkgY29tcG9zw6kgZGUgMyDDqWzDqW1lbnRzIG51bcOpcmlxdWVzIGF1IGNhcnLDqQ0KYGBgDQoNCmBgYHtyfQ0KSU1DIDwtIHBvaWRzIC8gdGFpbGxlICMgZGl2aXNlciBsJ29iamV0ICJwb2lkcyIgcGFyIGwnb2JqZXQgInRhaWxsZSIgKEF0dGVudGlvbiEgTGVzIHZlY3RldXJzIGRvaXZlbnQgw6p0cmUgZGUgbcOqbWUgbG9uZ3VldXIpDQpgYGANCg0KYGBge3J9DQpJTUMgIyB2b2lyIGxlIGNvbnRlbnUgZGUgbCdvYmpldA0KYGBgDQoNCmBgYHtyfQ0KbWVkaWFuKElNQykgIyBQYXNzZXIgbCdvYmpldCBJTUMgw6AgbGEgZm9uY3Rpb24gZGUgbcOpZGlhbmUNCmBgYA0KDQpgYGB7cn0NCklNQyAtIG1lYW4oSU1DKSAjIENhbGN1bGVyIGxhIGRpZmbDqXJlbmNlIGZhY2Ugw6AgbGEgbW95ZW5uZQ0KYGBgDQoNCjxicj4NCg0KIyMjIDUuMi4gRmFjdGV1cnMgICANCg0KDQoqIFZlY3RldXIgYXZlYyBkZXMgYXR0cmlidXRzIHNww6ljaWZpcXVlcywgZG9udCBsYSBzdHJ1Y3R1cmUgY29ycmVzcG9uZCBhdXggdmFyaWFibGVzIHF1YWxpdGF0aXZlcy4NCiogTGVzIG1vZGFsaXTDqXMgZGUgbGEgdmFyaWFibGUgY29ycmVzcG9uZGVudCDDoCBkZXMgIm5pdmVhdXgiICgqbGV2ZWxzKikgdW5pcXVlcyBldCBmaXhlcywgaWUgaW1wb3NzaWJsZSBk4oCZYXNzaWduZXIgdW5lIHZhbGV1ciBxdWkgbuKAmWEgcGFzIMOpdMOpIHByw6lhbGFibGVtZW50IGTDqWZpbmllIGNvbW1lIHVuZSBkZXMgbW9kYWxpdMOpcy4NCiogRGVzIMOpdGlxdWV0dGVzICgqbGFiZWxzKikgcGV1dmVudCDDqnRyZSBhc3NvY2nDqWVzIGF1eCBuaXZlYXV4Lg0KKiBMb3JzIGRlIGzigJlpbXBvcnRhdGlvbiBkZSBkb25uw6llcywgdG91dCBkw6lwZW5kYW50IGRlIGxhIGZvbmN0aW9uIGQnaW1wb3J0YXRpb24sIGxlcyB2YXJpYWJsZXMgcXVhbGl0YXRpdmVzIHNlcm9udCBpbXBvcnTDqWVzIHNvdXMgZm9ybWUgZGUgdmVjdGV1ciB0ZXh0dWVsIG91IGRlIGZhY3RldXIuDQoNCmBgYHtyfQ0KIyBDcsOpZXIgdW5lIHZhcmlhYmxlIGRlIHR5cGUgZmFjdGV1ciDDoCBwYXJ0aXIgZCd1biB2ZWN0ZXVyIHRleHR1ZWwgZGUgNSB2YWxldXJzIGRlIDIgbml2ZWF1eCBhdmVjIGxhIGZvbmN0aW9uIGZhY3RvcigpDQpzZXhlIDwtIGZhY3RvcihjKCJIIiwgIkgiLCAiRiIsICJIIiksIGxhYmVscyA9IGMoIkhvbW1lIiwgIkZlbW1lIikpDQpgYGANCg0KYGBge3J9DQojIEwnb2JqZXQgZXN0IHVuIGZhY3RldXIgYXZlYyAyIG1vZGFsaXTDqXMgKG5pdmVhdXgpIGTDqWZpbmlzIHBhciBkw6lmYXV0IGVuIGZvbmN0aW9uIGRlcyB2YWxldXJzIGZvdXJuaWVzIA0Kc3RyKHNleGUpDQpgYGANCg0KPGJyPg0KDQojIyMgNS4zLiBEYXRhZnJhbWVzICANCg0KKiBUYWJsZWF1IGRlIGRvbm7DqWVzIHBvdXZhbnQgcmVncm91cGVyIGRlcyB2ZWN0ZXVycyBkZSBkaWZmw6lyZW50cyB0eXBlcyAodmFyaWFibGVzIG51bcOpcmlxdWVzIGV0L291IHRleHR1ZWxsZXMpLg0KKiBTdHJ1Y3R1cmVsbGVtZW50LCBsZSBkYXRhZnJhbWUgZXN0IHVuZSAqKmxpc3RlKiogY29tcG9zw6llcyBkZSAqKnZlY3RldXJzIG5vbW3DqXMqKiAobm9tcyBkZSB2YXJpYWJsZXMgdW5pcXVlcykgZGUgbcOqbWUgKipsb25ndWV1cioqIChub21icmUgZCdvYnNlcnZhdGlvbnMpIG1haXMgcXVpIHBldXZlbnQgw6p0cmUgZGUgKiptb2RlcyBkaWZmw6lyZW50cyoqICh2YXJpYWJsZXMgbnVtw6lyaXF1ZXMsIHRleHR1ZWxsZXMpLg0KKiBDJ2VzdCBkb25jIHVuIHRhYmxlYXUgYXZlYyBkZXMgY29sb25uZXMgLSBgbmNvbCgpYCBldCBkZXMgbGlnbmVzIC0gYG5yb3coKWAsICBkb25jIDIgZGltZW5zaW9ucyAtIGBkaW0oKWAuDQoqIENyw6llIHVuIGpldSBkZSBkb25uw6llcyBhdmVjIGxhIGZvbmN0aW9uIGRhdGEuZnJhbWUoKSwgbWFpcyBvbiBsZSBjcsOpZSByYXJlbWVudCBtYW51ZWxsZW1lbnQsIGfDqW7DqXJhbGVtZW50IGltcG9ydMOpIGVuIGZvcm1hdCAudHh0LCAuY3N2LCAuLi4NCg0KYGBge3J9DQojIENyw6llciB1biBkYXRhIGZyYW1lIGF2ZWMgMyB2YXJpYWJsZXMgKDIgdmVjdGV1cnMgbnVtw6lyaXF1ZXMgZXQgMSB2ZWN0ZXVyIHRleHR1ZWwpIGF2ZWMgbGEgZm9uY3Rpb24gZGF0YS5mcmFtZSgpDQphZ2UgPC0gYyg0NSw2NSwyMiwzOCw1NCwzMSwyOSw0NCw1Niw2NykgDQpwb2lkcyA8LSBjKDE1MCwxMjUsMjEwLDE3NSwxMTAsMTgwLDEzMCwxNTUsMTkwLDEyMCkNCnNleGUgPC0gYygiSCIsIkYiLCJGIiwiSCIsIkgiLCJGIiwiRiIsIkgiLCJGIiwiSCIpDQpiZCA8LSBkYXRhLmZyYW1lKGFnZSwgc2V4ZSwgcG9pZHMpDQoNCiMjIFBsdXNpZXVycyBmb25jdGlvbnMgcGVybWV0dGVudCBkZSBmdXNpb25uZXIgZGVzIGNvbG9ubmVzLCBkZXMgbGlnbmVzIGV0IGRlcyB0YWJsZXMgZGUgZG9ubsOpZXM6IGBtZXJnZSgpYCwgYGNiaW5kKClgIGV0IGByYmluZCgpYC4uLiANCmBgYA0KDQpgYGB7cn0NCmJkIA0KYGBgDQoNCjxicj4NCg0KIyMjIDUuNC4gQ29uY2x1c2lvbjogVHlwZXMgZOKAmW9iamV0cyBldCBmb25jdGlvbnMgdXRpbGVzICANCg0KDQotIExlcyBvYmpldHMgZGFucyAqKlIqKiBzb250IGNhcmFjdMOpcmlzw6lzIHBhciBkaWZmw6lyZW50ZXMgcHJvcHJpw6l0w6lzIDogaWxzIHBvc3PDqGRlbnQgYXUgbWluaW11bSB1biBgbW9kZSgpYCwgbGUgdHlwZSBkZSBiYXNlIGRlIHNlcyBjb21wb3NhbnRlcywgZXQgdW5lIGxvbmd1ZXVyIOKAkyBgbGVuZ3RoKClgIC0gbGUgbm9tYnJlIGRlIGNvbXBvc2FudGVzLiANCg0KLSBMYSBmb25jdGlvbiBgdHlwZW9mKClgIGVzdCB0csOocyBzaW1pbGFpcmUgYXUgYG1vZGVgOyBlbGxlIG9mZnJlIHVuZSBkZXNjcmlwdGlvbiB1biBwZXUgcGx1cyBwcsOpY2lzZSBkdSBmb3JtYXQgZGUgc3RvY2thZ2UgaW50ZXJuZSBk4oCZdW4gb2JqZXQuDQoNCi0gTGVzIG9iamV0cyBvbnQgYXVzc2kgdW5lIGBjbGFzc2UoKWAgOiBj4oCZZXN0IHVuZSBwcm9wcmnDqXTDqSB1biBwZXUgcGx1cyBjb21wbGV4ZSAoaXNzdWUgZHUgbGFuZ2FnZSBTKSBhc3NpZ27DqWUgw6AgdW4gb2JqZXQgcG91ciBkw6lmaW5pciBs4oCZaW5mb3JtYXRpb24gY29udGVudWUgRVQgZMOpdGVybWluZXIgbGEgZmHDp29uIGRvbnQgbOKAmW9iamV0IHNlcmEgdHJhaXTDqSBwYXIgY2VydGFpbmVzIGZvbmN0aW9ucyBkaXRlcyBnw6luw6lyaXF1ZXMsIGllIGRvbnQgbGUgcsOpc3VsdGF0IGTDqXBlbmQgZHkgdHlwZSBkJ29iamV0IGZvdXJuaSAoY29tbWUgYHByaW50KClgLCBgc3VtbWFyeSgpYCwgYHBsb3QoKWApLg0KDQotIEJyZWYsIGxlICoqbW9kZSoqLCBsZSAqKnR5cGUqKiBldCBsYSAqKmNsYXNzZSoqIHNvbnQgc291dmVudCBwYXJlaWxzLCBtYWlzIHBhcyB0b3Vqb3VycyEgTGEgZm9uY3Rpb24gYHN0cigpYCBwZXV0IGF1c3NpIMOqdHJlIHV0aWxlIHBvdXIgcGx1cyBkZSBkw6l0YWlscyBzdXIgdW4gb2JqZXQgZXQgc2VzIMOpbMOpbWVudHMuDQoNCi0gTGVzIG9iamV0cywgZW4gcGx1cyBkZSBsZXVycyBjb21wb3NhbnRlcywgcGV1dmVudCBhdXNzaSBwb3Nzw6lkZXIgZGVzIGF0dHJpYnV0cyAtIGBhdHRyaWJ1dGVzKClgIOKAkyBtw6l0YWRvbm7DqWVzIGNvbnRlbmFudCBkZXMgaW5mb3JtYXRpb25zIGFkZGl0aW9ubmVsbGVzIHN1ciBsJ29iamV0IGNvbW1lIGRlcyBub21zIC0gYG5hbWVzKClgICjDqXRpcXVldHRlcyBkZXMgw6lsw6ltZW50cykgLSBldCBkZXMgZGltZW5zaW9ucyAtIGBkaW0oKWAgKGNvbG9ubmVzL2xpZ25lcyBkYW5zIHRhYmxlYXV4KS4NCg0KLSDDgCBub3RlcjoNCiAgICArIElsIGVzdCBwb3NzaWJsZSBkZSBjb252ZXJ0aXIgbGUgdHlwZSAobW9kZSkgZOKAmXVuIG9iamV0IGF2ZWM6IGBhcy5jaGFyYWN0ZXIoKWAsIGBhcy5saXN0KClgLCBgYXMubnVtZXJpYygpYCwgYGFzLmZhY3RvcigpYC4gDQogICAgKyBQb3VyIHbDqXJpZmllciBsZSBmb3JtYXQsIHJlbXBsYWNlciBhcy4gcGFyIGlzIDogYGlzLmNoYXJhY3RlcigpYCwgYGlzLmxpc3QoKWAsIGBpcy5udW1lcmljKClgLCBgaXMuZmFjdG9yKClgLCANCg0KPGJyPg0KDQoqKioNCg==