Este material apresenta uma breve introdução ao R aplicada aos tipos de variáveis

Variable Types

  1. character – Strings
  2. integer – Integers
  3. numeric – Integers + Fractions
  4. factor – Categorical variable where each level is a category
  5. logical – Boolean
  6. complex – Complex numbers

Data Types

  1. vector – A collection of elements of same class
  2. matrix – All columns must uniformly contain only one variable type.
  3. data.frame – The columns can contain different classes.
  4. list – Can hold objects of different classes and lengths

Variáveis Aleatórias (VA) Qualitativas

# VA Escritórios de uma empresa de consultoria
escritorios <- c("SP", "RJ", "RS", "PA", "RJ", "RS")
escritorios
[1] "SP" "RJ" "RS" "PA" "RJ" "RS"
str(escritorios)
 chr [1:6] "SP" "RJ" "RS" "PA" "RJ" "RS"
table(escritorios)
escritorios
PA RJ RS SP 
 1  2  2  1 
tab <-table(escritorios)
barplot(tab)

pie(tab)

# quer ajuda? Use o comando ? na frente da função. Ex: ?pie

Tabela de contingência

# VA nominal
escritorios <- c("SP", "RJ", "RS", "PA", "RJ", "RS")  
# VA nominal
porte <- c("G", "P", "M", "P", "G", "G") 
table(escritorios, porte)
           porte
escritorios G M P
         PA 0 0 1
         RJ 1 0 1
         RS 1 1 0
         SP 1 0 0
# VA ordinal
porte.o <- factor(c("G", "P", "M", "P", "G", "G"), 
                  levels = c("P", "M", "G"),
                  labels = c("Pequeno", "Médio", "Grande")
                  ) 
tab <- table(escritorios, porte.o)
tab
           porte.o
escritorios Pequeno Médio Grande
         PA       1     0      0
         RJ       1     0      1
         RS       0     1      1
         SP       0     0      1
# não está adequado pois não há freq sufuciente - teste não paramétrico alternativo: fisher.test(tab)
chisq.test(tab)
Aproxima攼㸷攼㸳o do qui-quadrado pode estar incorreta

    Pearson's Chi-squared test

data:  tab
X-squared = 5.5, df = 6, p-value = 0.4815
str(porte)
 chr [1:6] "G" "P" "M" "P" "G" "G"
str(porte.o)
 Factor w/ 3 levels "Pequeno","Médio",..: 3 1 2 1 3 3

Escala Nominal

empresa <- c("Gerdau", "Citygroup", "Santander", "Volkswagen", "Wal-Mart","Petrobras", "Vale","Philips", "Boing", "siemens")
# não use acento nas variáveis país = pais
pais <-c(1,5,4,2,5,1,1,3,5,2)
pais.o <-factor(pais, labels = c("Brasil", "Alemanha", "Holanda", "Espanha","Estados Unidos"))
pais
 [1] 1 5 4 2 5 1 1 3 5 2
# Prefiro importar dados de uma planilha!
table(pais)
pais
1 2 3 4 5 
3 2 1 1 3 
table(pais.o)
pais.o
        Brasil       Alemanha        Holanda        Espanha Estados Unidos 
             3              2              1              1              3 
sum(pais)
[1] 29
sum(pais.o) # não soma 
Error in Summary.factor(c(1L, 5L, 4L, 2L, 5L, 1L, 1L, 3L, 5L, 2L), na.rm = FALSE) : 
  ‘sum’ not meaningful for factors

Escala Ordinal

# Ranking de preferência a marcas de automóveis 
marca.a <-c(1,3,3,3,3)
marca.b <-c(2,2,2,1,1)
marca.c <-c(1,1,1,2,2)
cliente <- c("josé", "joão", "carlos", "mauro", "roberto")
dados <-data.frame(marca.a, marca.b, marca.c)
row.names(dados) <- c(cliente)
dados
str(dados)
'data.frame':   5 obs. of  3 variables:
 $ marca.a: num  1 3 3 3 3
 $ marca.b: num  2 2 2 1 1
 $ marca.c: num  1 1 1 2 2
marca.a <-factor(c(1,3,3,3,3), levels = c(1, 2, 3))
marca.b <-factor(c(2,2,2,1,1), levels = c(1, 2, 3))
marca.c <-factor(c(1,1,1,2,2), levels = c(1, 2, 3))
cliente <- c("josé", "joão", "carlos", "mauro", "roberto")
dados2 <-data.frame(marca.a, marca.b, marca.c)
row.names(dados2) <- c(cliente)
dados2
str(dados2)
'data.frame':   5 obs. of  3 variables:
 $ marca.a: Factor w/ 3 levels "1","2","3": 1 3 3 3 3
 $ marca.b: Factor w/ 3 levels "1","2","3": 2 2 2 1 1
 $ marca.c: Factor w/ 3 levels "1","2","3": 1 1 1 2 2

Variáveis Aleatórias (VA) Quantitativas

Escala razão

# instale o pacote com o comando install.packages("readxl")
#carregue o pacote para uso 
library(readxl)
# o arquivo xls deve estar no mesmo diretório de projeto do R
# para criar um projeto vá em File --> New project
varmetrica <- read_excel("varmetrica.xls")
varmetrica
varmetrica$nome
 [1] "Patrícia"  "Leonor"    "Ovídio"    "Mariana"   "Roberto"   "Letícia"  
 [7] "Dalila"    "Luiz"      "Paulo"     "Rodolfo"   "Renata"    "Antônio"  
[13] "Ana"       "Antonieta" "Júlia"    
varmetrica[,1]
 [1] "Patrícia"  "Leonor"    "Ovídio"    "Mariana"   "Roberto"   "Letícia"  
 [7] "Dalila"    "Luiz"      "Paulo"     "Rodolfo"   "Renata"    "Antônio"  
[13] "Ana"       "Antonieta" "Júlia"    
varmetrica$idade
 [1] 31 64 57 37 52 18 21 34 30 62 27 39 28 44 51
varmetrica[,2]
 [1] 31 64 57 37 52 18 21 34 30 62 27 39 28 44 51
varmetrica$renda_mensal
 [1] 12400 18000 16200  7200 20800  2100  1950 15600  3400 13300  4100 15600  8200
[14]  9520 11300
varmetrica[,3]
 [1] 12400 18000 16200  7200 20800  2100  1950 15600  3400 13300  4100 15600  8200
[14]  9520 11300
varmetrica[,c(2,3)]
# install.packages("psych")
library(psych)
describe(varmetrica$idade)
   vars  n  mean    sd median trimmed   mad min max range skew kurtosis   se
X1    1 15 39.67 14.67     37   39.46 14.83  18  64    46 0.26    -1.37 3.79
describe(varmetrica$renda_mensal)
   vars  n     mean      sd median  trimmed     mad  min   max range  skew kurtosis
X1    1 15 10644.67 6040.33  11300 10532.31 6375.18 1950 20800 18850 -0.03    -1.42
        se
X1 1559.61
describe(varmetrica[,c(2,3)])
             vars  n     mean      sd median  trimmed     mad  min   max range
idade           1 15    39.67   14.67     37    39.46   14.83   18    64    46
renda_mensal    2 15 10644.67 6040.33  11300 10532.31 6375.18 1950 20800 18850
              skew kurtosis      se
idade         0.26    -1.37    3.79
renda_mensal -0.03    -1.42 1559.61
hist(varmetrica$idade)

boxplot(varmetrica$idade)

boxplot(varmetrica[,c(2,3)])

varmetrica.p <- scale(varmetrica[,c(2,3)])
describe(varmetrica.p)
             vars  n mean sd median trimmed  mad   min  max range  skew kurtosis
idade           1 15    0  1  -0.18   -0.01 1.01 -1.48 1.66  3.14  0.26    -1.37
renda_mensal    2 15    0  1   0.11   -0.02 1.06 -1.44 1.68  3.12 -0.03    -1.42
               se
idade        0.26
renda_mensal 0.26
boxplot(varmetrica.p)

# estratificar 
table(cut(varmetrica$idade,2))

(18,41] (41,64] 
      9       6 
table(cut(varmetrica$idade,3))

  (18,33.3] (33.3,48.7]   (48.7,64] 
          6           4           5 
plot(varmetrica[,c(2,3)])

plot(varmetrica.p)
par(mfrow=c(1,2))

plot(varmetrica[,c(2,3)])
plot(varmetrica.p)
par(mfrow=c(1,1))

cor(varmetrica[,c(2,3)])
                 idade renda_mensal
idade        1.0000000    0.7688348
renda_mensal 0.7688348    1.0000000
cor(varmetrica$idade,varmetrica$renda_mensal)
[1] 0.7688348
cor.test(varmetrica$idade,varmetrica$renda_mensal)

    Pearson's product-moment correlation

data:  varmetrica$idade and varmetrica$renda_mensal
t = 4.3351, df = 13, p-value = 0.000809
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.4232781 0.9191102
sample estimates:
      cor 
0.7688348 
# ?cor.test
# se a variável fosse ordinal, correlação por postos seria o método adequado
cor.test(varmetrica$idade,varmetrica$renda_mensal, method = c("spearman"))
Imposs攼㹤vel calcular o valor exato de p com empates

    Spearman's rank correlation rho

data:  varmetrica$idade and varmetrica$renda_mensal
S = 99.589, p-value = 0.0001689
alternative hypothesis: true rho is not equal to 0
sample estimates:
     rho 
0.822163 
# estratificando as VA
table(varmetrica$idade)

18 21 27 28 30 31 34 37 39 44 51 52 57 62 64 
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
min(varmetrica$idade)
[1] 18
max(varmetrica$idade)
[1] 64
# ?cut
idade.est <- cut(varmetrica$idade,
                 breaks=c(18,29,37,52,65),
                 labels = NULL,
                 include.lowest = T,
                 right = F)
idade.est 
 [1] [29,37) [52,65] [52,65] [37,52) [52,65] [18,29) [18,29) [29,37) [29,37) [52,65]
[11] [18,29) [37,52) [18,29) [37,52) [37,52)
Levels: [18,29) [29,37) [37,52) [52,65]
idade <- table(idade.est)
# ?barplot
barplot(idade, 
        xlab = "Idade (Qualitativa)",
        ylab = "Frequência",
        main="Criação de faixas para VA quantitativa")

library(readxl)
superm_bra <- read_excel("supermercadosbrasileiros.xls")
# criar um objeto somente com as variáveis 2 a 4
superm_bra2 <- sm_bra[,2:4]
library(psych)
describe(superm_bra2)
             vars  n         mean           sd    median      trimmed          mad
Faturamento     1 30 1.884472e+09 3.996049e+09 460124320 643332737.46 368224160.24
ÁreaVendas      2 30 1.526356e+05 3.334398e+05     37359     47868.58     31963.37
Funcionários    3 30 8.738930e+03 1.556787e+04      3671      4051.58      2949.63
                   min         max       range skew kurtosis           se
Faturamento  205183214 16168968046 15963784832 2.62     5.37 729575324.84
ÁreaVendas       12000     1206254     1194254 2.54     4.70     60877.49
Funcionários      1281       62803       61522 2.51     4.89      2842.29
boxplot(superm_bra2)

cor(superm_bra2)
             Faturamento ÁreaVendas Funcionários
Faturamento    1.0000000  0.9901087    0.9931242
ÁreaVendas     0.9901087  1.0000000    0.9882418
Funcionários   0.9931242  0.9882418    1.0000000
plot(superm_bra2)

library(corrplot)
res <- cor(superm_bra2)
corrplot(res, type = "upper", order = "hclust", 
         tl.col = "black", tl.srt = 45)

corrplot(res, method="number")

LS0tDQp0aXRsZTogIlRpcG9zIGRlIFZhcmnDoXZlaXMgZSBFc2NhbGFzIGRlIE1lbnN1cmHDp8OjbyAtIFNMSURFUyINCmF1dGhvcjogIkxlb25pLCBSLiBDLiBQcm9mZXNzb3IgRHIuIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCioqKg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRikNCmBgYA0KDQojIEVzdGUgbWF0ZXJpYWwgYXByZXNlbnRhIHVtYSBicmV2ZSBpbnRyb2R1w6fDo28gYW8gUiBhcGxpY2FkYSBhb3MgdGlwb3MgZGUgdmFyacOhdmVpcyANCj4gVmFyaWFibGUgVHlwZXMNCg0KMS4gY2hhcmFjdGVyIOKAkyBTdHJpbmdzDQoyLiBpbnRlZ2VyIOKAkyBJbnRlZ2Vycw0KMy4gbnVtZXJpYyDigJMgSW50ZWdlcnMgKyBGcmFjdGlvbnMNCjQuIGZhY3RvciDigJMgQ2F0ZWdvcmljYWwgdmFyaWFibGUgd2hlcmUgZWFjaCBsZXZlbCBpcyBhIGNhdGVnb3J5DQo1LiBsb2dpY2FsIOKAkyBCb29sZWFuDQo2LiBjb21wbGV4IOKAkyBDb21wbGV4IG51bWJlcnMNCg0KPiBEYXRhIFR5cGVzDQoNCjEuIHZlY3RvciDigJMgQSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIG9mIHNhbWUgY2xhc3MNCjIuIG1hdHJpeCDigJMgQWxsIGNvbHVtbnMgbXVzdCB1bmlmb3JtbHkgY29udGFpbiBvbmx5IG9uZSB2YXJpYWJsZSB0eXBlLg0KMy4gZGF0YS5mcmFtZSDigJMgVGhlIGNvbHVtbnMgY2FuIGNvbnRhaW4gZGlmZmVyZW50IGNsYXNzZXMuDQo0LiBsaXN0IOKAkyBDYW4gaG9sZCBvYmplY3RzIG9mIGRpZmZlcmVudCBjbGFzc2VzIGFuZCBsZW5ndGhzDQoNCg0KIyBWYXJpw6F2ZWlzIEFsZWF0w7NyaWFzIChWQSkgUXVhbGl0YXRpdmFzDQoNCmBgYHtyfQ0KDQojIFZBIEVzY3JpdMOzcmlvcyBkZSB1bWEgZW1wcmVzYSBkZSBjb25zdWx0b3JpYQ0KDQplc2NyaXRvcmlvcyA8LSBjKCJTUCIsICJSSiIsICJSUyIsICJQQSIsICJSSiIsICJSUyIpDQplc2NyaXRvcmlvcw0Kc3RyKGVzY3JpdG9yaW9zKQ0KdGFibGUoZXNjcml0b3Jpb3MpDQp0YWIgPC10YWJsZShlc2NyaXRvcmlvcykNCmJhcnBsb3QodGFiKQ0KcGllKHRhYikNCiMgcXVlciBhanVkYT8gVXNlIG8gY29tYW5kbyA/IG5hIGZyZW50ZSBkYSBmdW7Dp8Ojby4gRXg6ID9waWUNCmBgYA0KDQo+ICBUYWJlbGEgZGUgY29udGluZ8OqbmNpYQ0KDQpgYGB7cn0NCiMgVkEgbm9taW5hbA0KZXNjcml0b3Jpb3MgPC0gYygiU1AiLCAiUkoiLCAiUlMiLCAiUEEiLCAiUkoiLCAiUlMiKSAgDQojIFZBIG5vbWluYWwNCnBvcnRlIDwtIGMoIkciLCAiUCIsICJNIiwgIlAiLCAiRyIsICJHIikgDQp0YWJsZShlc2NyaXRvcmlvcywgcG9ydGUpDQoNCiMgVkEgb3JkaW5hbA0KcG9ydGUubyA8LSBmYWN0b3IoYygiRyIsICJQIiwgIk0iLCAiUCIsICJHIiwgIkciKSwgDQogICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJQIiwgIk0iLCAiRyIpLA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUGVxdWVubyIsICJNw6lkaW8iLCAiR3JhbmRlIikNCiAgICAgICAgICAgICAgICAgICkgDQoNCnRhYiA8LSB0YWJsZShlc2NyaXRvcmlvcywgcG9ydGUubykNCnRhYg0KDQojIG7Do28gZXN0w6EgYWRlcXVhZG8gcG9pcyBuw6NvIGjDoSBmcmVxIHN1ZnVjaWVudGUgLSB0ZXN0ZSBuw6NvIHBhcmFtw6l0cmljbyBhbHRlcm5hdGl2bzogZmlzaGVyLnRlc3QodGFiKQ0KDQpjaGlzcS50ZXN0KHRhYikNCg0Kc3RyKHBvcnRlKQ0Kc3RyKHBvcnRlLm8pDQoNCmBgYA0KDQo+IEVzY2FsYSBOb21pbmFsDQoNCmBgYHtyfQ0KZW1wcmVzYSA8LSBjKCJHZXJkYXUiLCAiQ2l0eWdyb3VwIiwgIlNhbnRhbmRlciIsICJWb2xrc3dhZ2VuIiwgIldhbC1NYXJ0IiwiUGV0cm9icmFzIiwgIlZhbGUiLCJQaGlsaXBzIiwgIkJvaW5nIiwgInNpZW1lbnMiKQ0KDQojIG7Do28gdXNlIGFjZW50byBuYXMgdmFyacOhdmVpcyBwYcOtcyA9IHBhaXMNCnBhaXMgPC1jKDEsNSw0LDIsNSwxLDEsMyw1LDIpDQoNCnBhaXMubyA8LWZhY3RvcihwYWlzLCBsYWJlbHMgPSBjKCJCcmFzaWwiLCAiQWxlbWFuaGEiLCAiSG9sYW5kYSIsICJFc3BhbmhhIiwiRXN0YWRvcyBVbmlkb3MiKSkNCnBhaXMNCg0KIyBQcmVmaXJvIGltcG9ydGFyIGRhZG9zIGRlIHVtYSBwbGFuaWxoYSENCnRhYmxlKHBhaXMpDQp0YWJsZShwYWlzLm8pDQoNCnN1bShwYWlzKQ0Kc3VtKHBhaXMubykgIyBuw6NvIHNvbWEgDQoNCmBgYA0KDQo+IEVzY2FsYSBPcmRpbmFsDQoNCmBgYHtyfQ0KIyBSYW5raW5nIGRlIHByZWZlcsOqbmNpYSBhIG1hcmNhcyBkZSBhdXRvbcOzdmVpcyANCg0KbWFyY2EuYSA8LWMoMSwzLDMsMywzKQ0KbWFyY2EuYiA8LWMoMiwyLDIsMSwxKQ0KbWFyY2EuYyA8LWMoMSwxLDEsMiwyKQ0KY2xpZW50ZSA8LSBjKCJqb3PDqSIsICJqb8OjbyIsICJjYXJsb3MiLCAibWF1cm8iLCAicm9iZXJ0byIpDQoNCmRhZG9zIDwtZGF0YS5mcmFtZShtYXJjYS5hLCBtYXJjYS5iLCBtYXJjYS5jKQ0Kcm93Lm5hbWVzKGRhZG9zKSA8LSBjKGNsaWVudGUpDQpkYWRvcw0Kc3RyKGRhZG9zKQ0KDQptYXJjYS5hIDwtZmFjdG9yKGMoMSwzLDMsMywzKSwgbGV2ZWxzID0gYygxLCAyLCAzKSkNCm1hcmNhLmIgPC1mYWN0b3IoYygyLDIsMiwxLDEpLCBsZXZlbHMgPSBjKDEsIDIsIDMpKQ0KbWFyY2EuYyA8LWZhY3RvcihjKDEsMSwxLDIsMiksIGxldmVscyA9IGMoMSwgMiwgMykpDQpjbGllbnRlIDwtIGMoImpvc8OpIiwgImpvw6NvIiwgImNhcmxvcyIsICJtYXVybyIsICJyb2JlcnRvIikNCmRhZG9zMiA8LWRhdGEuZnJhbWUobWFyY2EuYSwgbWFyY2EuYiwgbWFyY2EuYykNCnJvdy5uYW1lcyhkYWRvczIpIDwtIGMoY2xpZW50ZSkNCmRhZG9zMg0Kc3RyKGRhZG9zMikNCg0KYGBgDQoNCiMgVmFyacOhdmVpcyBBbGVhdMOzcmlhcyAoVkEpIFF1YW50aXRhdGl2YXMNCj4gRXNjYWxhIHJhesOjbw0KDQpgYGB7cn0NCiMgaW5zdGFsZSBvIHBhY290ZSBjb20gbyBjb21hbmRvIGluc3RhbGwucGFja2FnZXMoInJlYWR4bCIpDQojY2FycmVndWUgbyBwYWNvdGUgcGFyYSB1c28gDQpsaWJyYXJ5KHJlYWR4bCkNCiMgbyBhcnF1aXZvIHhscyBkZXZlIGVzdGFyIG5vIG1lc21vIGRpcmV0w7NyaW8gZGUgcHJvamV0byBkbyBSDQojIHBhcmEgY3JpYXIgdW0gcHJvamV0byB2w6EgZW0gRmlsZSAtLT4gTmV3IHByb2plY3QNCnZhcm1ldHJpY2EgPC0gcmVhZF9leGNlbCgidmFybWV0cmljYS54bHMiKQ0KdmFybWV0cmljYQ0KYGBgDQoNCmBgYHtyfQ0KdmFybWV0cmljYSRub21lDQp2YXJtZXRyaWNhWywxXQ0KdmFybWV0cmljYSRpZGFkZQ0KdmFybWV0cmljYVssMl0NCnZhcm1ldHJpY2EkcmVuZGFfbWVuc2FsDQp2YXJtZXRyaWNhWywzXQ0KdmFybWV0cmljYVssYygyLDMpXQ0KDQojIGluc3RhbGwucGFja2FnZXMoInBzeWNoIikNCmxpYnJhcnkocHN5Y2gpDQoNCmRlc2NyaWJlKHZhcm1ldHJpY2EkaWRhZGUpDQpkZXNjcmliZSh2YXJtZXRyaWNhJHJlbmRhX21lbnNhbCkNCmRlc2NyaWJlKHZhcm1ldHJpY2FbLGMoMiwzKV0pDQoNCmhpc3QodmFybWV0cmljYSRpZGFkZSkNCmJveHBsb3QodmFybWV0cmljYSRpZGFkZSkNCg0KYm94cGxvdCh2YXJtZXRyaWNhWyxjKDIsMyldKQ0KDQp2YXJtZXRyaWNhLnAgPC0gc2NhbGUodmFybWV0cmljYVssYygyLDMpXSkNCmRlc2NyaWJlKHZhcm1ldHJpY2EucCkNCg0KYm94cGxvdCh2YXJtZXRyaWNhLnApDQoNCiMgZXN0cmF0aWZpY2FyIA0KDQp0YWJsZShjdXQodmFybWV0cmljYSRpZGFkZSwyKSkNCnRhYmxlKGN1dCh2YXJtZXRyaWNhJGlkYWRlLDMpKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdCh2YXJtZXRyaWNhWyxjKDIsMyldKQ0KcGxvdCh2YXJtZXRyaWNhLnApDQoNCnBhcihtZnJvdz1jKDEsMikpDQpwbG90KHZhcm1ldHJpY2FbLGMoMiwzKV0pDQpwbG90KHZhcm1ldHJpY2EucCkNCnBhcihtZnJvdz1jKDEsMSkpDQoNCmNvcih2YXJtZXRyaWNhWyxjKDIsMyldKQ0KY29yKHZhcm1ldHJpY2EkaWRhZGUsdmFybWV0cmljYSRyZW5kYV9tZW5zYWwpDQoNCmNvci50ZXN0KHZhcm1ldHJpY2EkaWRhZGUsdmFybWV0cmljYSRyZW5kYV9tZW5zYWwpDQoNCiMgP2Nvci50ZXN0DQojIHNlIGEgdmFyacOhdmVsIGZvc3NlIG9yZGluYWwsIGNvcnJlbGHDp8OjbyBwb3IgcG9zdG9zIHNlcmlhIG8gbcOpdG9kbyBhZGVxdWFkbw0KY29yLnRlc3QodmFybWV0cmljYSRpZGFkZSx2YXJtZXRyaWNhJHJlbmRhX21lbnNhbCwgbWV0aG9kID0gYygic3BlYXJtYW4iKSkNCmBgYA0KYGBge3J9DQojIGVzdHJhdGlmaWNhbmRvIGFzIFZBDQoNCnRhYmxlKHZhcm1ldHJpY2EkaWRhZGUpDQptaW4odmFybWV0cmljYSRpZGFkZSkNCm1heCh2YXJtZXRyaWNhJGlkYWRlKQ0KDQoNCiMgP2N1dA0KaWRhZGUuZXN0IDwtIGN1dCh2YXJtZXRyaWNhJGlkYWRlLA0KICAgICAgICAgICAgICAgICBicmVha3M9YygxOCwyOSwzNyw1Miw2NSksDQogICAgICAgICAgICAgICAgIGxhYmVscyA9IE5VTEwsDQogICAgICAgICAgICAgICAgIGluY2x1ZGUubG93ZXN0ID0gVCwNCiAgICAgICAgICAgICAgICAgcmlnaHQgPSBGKQ0KaWRhZGUuZXN0IA0KDQppZGFkZSA8LSB0YWJsZShpZGFkZS5lc3QpDQoNCiMgP2JhcnBsb3QNCmJhcnBsb3QoaWRhZGUsIA0KICAgICAgICB4bGFiID0gIklkYWRlIChRdWFsaXRhdGl2YSkiLA0KICAgICAgICB5bGFiID0gIkZyZXF1w6puY2lhIiwNCiAgICAgICAgbWFpbj0iQ3JpYcOnw6NvIGRlIGZhaXhhcyBwYXJhIFZBIHF1YW50aXRhdGl2YSIpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCnN1cGVybV9icmEgPC0gcmVhZF9leGNlbCgic3VwZXJtZXJjYWRvc2JyYXNpbGVpcm9zLnhscyIpDQoNCiMgY3JpYXIgdW0gb2JqZXRvIHNvbWVudGUgY29tIGFzIHZhcmnDoXZlaXMgMiBhIDQNCnN1cGVybV9icmEyIDwtIHNtX2JyYVssMjo0XQ0KDQpsaWJyYXJ5KHBzeWNoKQ0KZGVzY3JpYmUoc3VwZXJtX2JyYTIpDQpib3hwbG90KHN1cGVybV9icmEyKQ0KDQpjb3Ioc3VwZXJtX2JyYTIpDQoNCnBsb3Qoc3VwZXJtX2JyYTIpDQoNCmxpYnJhcnkoY29ycnBsb3QpDQpyZXMgPC0gY29yKHN1cGVybV9icmEyKQ0KY29ycnBsb3QocmVzLCB0eXBlID0gInVwcGVyIiwgb3JkZXIgPSAiaGNsdXN0IiwgDQogICAgICAgICB0bC5jb2wgPSAiYmxhY2siLCB0bC5zcnQgPSA0NSkNCmNvcnJwbG90KHJlcywgbWV0aG9kPSJudW1iZXIiKQ0KYGBgDQoNCg==