Universidade Estadual da Paraíba - UEPB

Relatório 1 em R - Probabilidade e Estatística

Centro de Ciências e Tecnologia (CCT)

Departamento de Computação (DC)


Aluno: Alyssandro Dyogo Pereira Ramos


1 - Conhecendo a Base de Dados

Dados_Funcionarios

Base de dados de funcionários.


2 - Análise da Distribuição do Estado Civil entre os Funcionários

2.1 - Tabela de frequência absoluta:

freq_absoluta_estado_civil <- table(Dados_Funcionarios$Est.civil)
freq_relativa_estado_civil <- prop.table(freq_absoluta_estado_civil)

print(freq_absoluta_estado_civil)

  casado solteiro 
      20       16 

2.2 - Tabela de frequência relativa:

print(freq_relativa_estado_civil)

   casado  solteiro 
0.5555556 0.4444444 
par(mfrow = c(1,2))

barplot(freq_absoluta_estado_civil, 
        main = "Frequência Absoluta de Estado Civil",
        xlab = "Estado Civil",
        ylab = "Frequência",
        col = rainbow(length(freq_relativa_estado_civil)),
        las=1,
        border = "black")

pie(freq_relativa_estado_civil,
    main = "Distribuição do Estado Civil",
    las=1,
    col = rainbow(length(freq_relativa_estado_civil)))

par(mfrow = c(1,1))

Podemos observar uma disparidade mínima na distribuição dos estados com uma diferença de aproximadamente 0,6% entre eles.


3 - Análise da Distribuição do Grau de Instrução entre os Funcionários

3.1 - Tabela de frequência absoluta do grau de instrução dos funcionários:

freq_absoluta_grau_instrucao <- table(Dados_Funcionarios$Inst)
freq_relativa_grau_instrucao <- prop.table(freq_absoluta_grau_instrucao)

print(freq_absoluta_grau_instrucao)

 1o Grau  2o Grau Superior 
      12       18        6 


3.2 - Tabela de frequência relativa do grau de instrução dos funcionários:

print(freq_relativa_grau_instrucao)

  1o Grau   2o Grau  Superior 
0.3333333 0.5000000 0.1666667 
barplot(freq_absoluta_grau_instrucao,
        main = "Frequência Absoluta do Grau de Instrução de Funcionários",
        xlab = "Grau de Instrucao",
        ylab = "Frequência",
        col = (rainbow(length(freq_relativa_grau_instrucao))),
        border = "black",
        las=1)

pie(freq_relativa_grau_instrucao,
    main = "Distribuição do Grau de instrução de Funcionários",
    las=2,
    col = (rainbow(length(freq_relativa_grau_instrucao))))

Podemos observar que metado dos funcionários possuem formação até o 2°grau e a minoria, compondo apenas pouco mais de 16%, tem nível superior.


4 - Análise da Quantidade de Filhos dos Funcionários

4.1 - Tabela de Frequência Absoluta do Número de Filhos:

freq_absoluta_num_filhos <- table(Dados_Funcionarios$Filhos)
print(freq_absoluta_num_filhos)

0 1 2 3 5 
4 5 7 3 1 

4.2 - Tabela de Frequência Relativa do Número de Filhos:

freq_relativa_num_filhos <- prop.table(freq_absoluta_num_filhos)
print(freq_relativa_num_filhos)

   0    1    2    3    5 
0.20 0.25 0.35 0.15 0.05 

4.3 - Tabela de Frequência Relativa Acumulada do Número de Filhos:

freq_absoluta_acumulada_num_filhos <- cumsum(freq_absoluta_num_filhos)
print(freq_absoluta_acumulada_num_filhos)
 0  1  2  3  5 
 4  9 16 19 20 


4.4 - Gráfico de Frequências Relativas do Número de Filhos

barplot(freq_relativa_num_filhos,
        main = "Frequência Relativa do Número de Filhos de Funcionários",
        xlab = "Número de Filhos",
        ylab = "Proporção",
        col = (rainbow(length(freq_relativa_num_filhos))),
        border = "black",
        ylim = c(0, 1),
        las=1)


barplot(cumsum(freq_relativa_num_filhos),
        main = "Frequência Relativa Acumulada do Número de Filhos de Funcionários",
        xlab = "Número de Filhos",
        ylab = "Proporção Acumulada do Número de Filhos",
        col = (rainbow(length(freq_relativa_num_filhos))),
        border = "black",
        ylim = c(0, 1),
        las=1)

Podemos observar que 80% dos funcionários possuem 2 filhos ou menos e apenas 20% possuem 3 ou 5 filhos. Devemos observar ainda que 16 dos funcionários não possuem informações quanto ao número de filhos, ou seja, a margem de análise foi de apenas 20 dos 36 funcionários.


5 - Análise Sobre o Salário dos Funcionários

5.1 - Valor Máximo de salário Dentre os Funcionários (x1000 R$):

valor_maximo_salario <- max(Dados_Funcionarios$Salario) 
print(valor_maximo_salario)
[1] 23.3

5.2 - Valor Mínimo de Salário Dentre os Funcionários (x1000 R$):

valor_minimo_salario <- min(Dados_Funcionarios$Salario) 
print(valor_minimo_salario)
[1] 4

5.3 - Quantidade Ideal de Classes para Tabela de Frequência - Regra de Stuges:

total_salarios <- length(Dados_Funcionarios$Salario) 
K <- round(1 + (3.3 * log10(total_salarios))) 
print(K)
[1] 6

5.4 - Histograma do Salário de Funcionários:

hist(Dados_Funcionarios$Salario, 
  breaks = K, 
  main = "Histograma Do Salário de Funcionários", 
  xlab = "Salário", 
  ylab = "Frequência", 
  col = "lightblue", 
  border = "black", 
  ylim = c(0, 20), 
  las=1) 

5.5 - Medidas Estatísticas do Salário:

media_salario <- mean(Dados_Funcionarios$Salario) 
variancia_salario <- var(Dados_Funcionarios$Salario) 
desvio_padrao_salario <- sd(Dados_Funcionarios$Salario) 
mediana_salario <- median(Dados_Funcionarios$Salario) 
quantis_salario <- quantile(Dados_Funcionarios$Salario, probs = c(0.25, 0.5, 0.75))
print(paste("Média do Salário(x1000 R$):", round(media_salario, 2)))
[1] "Média do Salário(x1000 R$): 11.12"
print(paste("Variância do Salário(x1000 R$):", round(variancia_salario, 2)))
[1] "Variância do Salário(x1000 R$): 21.04"
print(paste("Desvio Padrão do Salário(x1000 R$):", round(desvio_padrao_salario, 2)))
[1] "Desvio Padrão do Salário(x1000 R$): 4.59"
print(paste("Mediana do Salário(x1000 R$):", round(mediana_salario, 2)))
[1] "Mediana do Salário(x1000 R$): 10.16"
print(paste("Quantis do Salário (25%):", quantis_salario[1]))
[1] "Quantis do Salário (25%): 7.5525"
print(paste("Quantis do Salário (50%):", quantis_salario[2]))
[1] "Quantis do Salário (50%): 10.165"
print(paste("Quantis do Salário (75%):", quantis_salario[3]))
[1] "Quantis do Salário (75%): 14.06"

A distribuição salarial dos funcionários apresenta uma leve tendência à direita, com a média de R$11,12 mil maior que a mediana de R$10,165 mil, indicando a influência de salários mais altos que levam a uma elevação. A maioria dos salários se concentra entre R$7,55 mil e R$14,06 mil, com um desvio padrão de 4,59, refletindo uma dispersão moderada. O histograma confirma essa distribuição, mostrando um pico entre R$5 mil e R$15 mil, com poucos valores extremos à direita e à esquerda do histograma.


6 - Análise da Relação entre o Estado Civil dos Funcionários e seu Grau de Instrução

6.1 -Tabela de Contingência Relacionando o Estado Civil e o Grau de Instrução:

tabela_contigencia_estadoCivil_grauInstrucao <- table(Dados_Funcionarios$Est.civil,
                                                      Dados_Funcionarios$Inst)
print(tabela_contigencia_estadoCivil_grauInstrucao)
          
           1o Grau 2o Grau Superior
  casado         5      12        3
  solteiro       7       6        3

Podemos observar uma disparidade relevante entre os funcionários de formação até 2° grau onde o dobro deles é casado. Contudo, nas demais, essa disparidade não se apresenta, nos de 1°grau temos uma diferença de apenas 1 entre os casados e solteiros. Nos de formação superior sequer há diferência. Talvez isso possa sugerir uma relação entre a idade dos funcionários com seu grau de instrução, contudo apenas com base nesses dados não há resultados conclusivos.

6.2 - Gráfico de Relação entre Estado Civil e Grau de Instrução:

cores <- rainbow(nrow(tabela_contigencia_estadoCivil_grauInstrucao))

barplot(tabela_contigencia_estadoCivil_grauInstrucao,
        beside = FALSE,
        main = "Gráfico de Cruzamento do Estado Civil e Grau de Instrução Sobrepostos",
        xlab = "Grau de Instrução",
        ylab = "Frequência",
        ylim = c(0, 20),
        col = cores,
        las=1)

legend("topright",
       legend = rownames(tabela_contigencia_estadoCivil_grauInstrucao),
       fill = cores,
       title = "Estado Civil")


barplot(tabela_contigencia_estadoCivil_grauInstrucao,
        beside = TRUE,
        main = "Gráfico de Cruzamento do Estado Civil e Grau de Instrução Lado a Lado",
        xlab = "Grau de Instrução",
        ylab = "Frequência",
        ylim = c(0, 20),
        col = cores,
        las=1)

legend("topright",
       legend = rownames(tabela_contigencia_estadoCivil_grauInstrucao),
       fill = cores,
       title = "Estado Civil")

Os gráficos apenas seguem a reforçar a análise anterior. Pode haver uma relação, contudo sem resultados conclusivos dada a quantidade de dados.


7 - Análise de Relação entre Grau de Instrução e Salário dos Funcionários

7.1 - Boxplot para Verificação de Relação entre as Variáveis:

boxplot(Dados_Funcionarios$Salario ~ Dados_Funcionarios$Inst,
        main = "Distribuição Salarial por Grau de Instrução",
        xlab = "Grau de Instrução",
        ylab = "Salário",
        col = "lightblue",
        notch = FALSE,
        las=1)

O boxplot evidencia uma relação clara entre o grau de instrução dos funcionários com seus respectivos salários. Podemos observar que para cada grau de instrução, mesmo o menor valor desse, sempre acaba por ser aproximo do valor máximo de salário do grau de instrução mais baixo que o antecede, além do que os funcionários de nível superior se destacam com os salários mais altos, enquanto que os de 2°grau ficam com uma faixa mais próxima ao meio e os de 1° grau com os mais baixos, sequer chegando aos R$10 mil que é menos que a média dos de 2° grau.

7.2 - Medidas estatísticas dos Salários para cada Grau de Instrução:

media_salaria_por_grau_instrucao <- tapply(Dados_Funcionarios$Salario, Dados_Funcionarios$Inst, mean, na.rm=TRUE) 
desvio_padrao_por_grau_instrucao <- tapply(Dados_Funcionarios$Salario, Dados_Funcionarios$Inst, sd, na.rm=TRUE) 
var_salario_por_grau_instrucao <- tapply(Dados_Funcionarios$Salario, Dados_Funcionarios$Inst, var, na.rm=TRUE) 
medianas_salario_por_grau_instrucao <- tapply(Dados_Funcionarios$Salario, Dados_Funcionarios$Inst, median, na.rm=TRUE)
quartis_salario_por_grau_instrucao <- tapply(Dados_Funcionarios$Salario, Dados_Funcionarios$Inst, quantile, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm=TRUE)

graus_instrucao <- c("1° Grau", "2° Grau", "Superior")

cat("\nMédia Salarial por Grau de Instrução:\n")

Média Salarial por Grau de Instrução:
for (i in seq_along(graus_instrucao)) {
  cat(sprintf("%s: %.2f\n", graus_instrucao[i], media_salaria_por_grau_instrucao[i]))
}
1° Grau: 7.84
2° Grau: 11.53
Superior: 16.48
cat("\nVariância Salarial por Grau de Instrução:\n")

Variância Salarial por Grau de Instrução:
for (i in seq_along(graus_instrucao)) {
  cat(sprintf("%s: %.2f\n", graus_instrucao[i], var_salario_por_grau_instrucao[i]))
}
1° Grau: 8.74
2° Grau: 13.80
Superior: 20.27
cat("\nDesvio Padrão Salarial por Grau de Instrução:\n")

Desvio Padrão Salarial por Grau de Instrução:
for (i in seq_along(graus_instrucao)) {
  cat(sprintf("%s: %.2f\n", graus_instrucao[i], desvio_padrao_por_grau_instrucao[i]))
}
1° Grau: 2.96
2° Grau: 3.72
Superior: 4.50
cat("\nMediana Salarial por Grau de Instrução:\n")

Mediana Salarial por Grau de Instrução:
for (i in seq_along(graus_instrucao)) {
  cat(sprintf("%s: %.2f\n", graus_instrucao[i], medianas_salario_por_grau_instrucao[i]))
}
1° Grau: 7.12
2° Grau: 10.91
Superior: 16.74
cat("\nQuartis Salarial por Grau de Instrução:\n")

Quartis Salarial por Grau de Instrução:
for (i in seq_along(graus_instrucao)) {
  quartis <- quartis_salario_por_grau_instrucao[[i]]  # Extrai o vetor de quartis
  cat(sprintf(
    "%s:\n  Mínimo: %.2f\n  1º Quartil (Q1): %.2f\n  Mediana (Q2): %.2f\n  3º Quartil (Q3): %.2f\n  Máximo: %.2f\n\n", 
    graus_instrucao[i], quartis[1], quartis[2], quartis[3], quartis[4], quartis[5]
  ))
}
1° Grau:
  Mínimo: 4.00
  1º Quartil (Q1): 6.01
  Mediana (Q2): 7.12
  3º Quartil (Q3): 9.16
  Máximo: 13.85

2° Grau:
  Mínimo: 5.73
  1º Quartil (Q1): 8.84
  Mediana (Q2): 10.91
  3º Quartil (Q3): 14.42
  Máximo: 19.40

Superior:
  Mínimo: 10.53
  1º Quartil (Q1): 13.65
  Mediana (Q2): 16.74
  3º Quartil (Q3): 18.38
  Máximo: 23.30

Podemos observar mais claramente os resultados analisados no boxplot, agora com a média salarial para cada grau de instrução. Temos uma diferença de mais de R$3 mil entre as médias salariais dos funcionários de grau de instrução até o 1° grau e os de 2° grau. Já entre os de 2° grau e superior, a diferença é ainda maior, chegando a quase R$5 mil.

Além disso, os valores salariais se tornam menos homogêneos à medida que o grau de instrução aumenta. O desvio padrão dos salários é maior para os funcionários com ensino superior (R$4,50 mil) em comparação aos de ensino médio R$3,72 mil e fundamental R$2,96 mil, indicando que os salários nesse grupo variam mais.

Ao analisar os quartis salariais, fica evidente que a maioria dos funcionários com ensino superior ganha mais do que aqueles com escolaridade inferior. O primeiro quartil Q1 do ensino superior já está acima do terceiro quartil Q3 do ensino fundamental, o que significa que 75% dos funcionários com ensino superior ganham mais do que 75% dos funcionários com ensino fundamental. Isso mostra uma desigualdade significativa e reforça o impacto do grau de instrução nos salários.

Por fim, a maior dispersão salarial entre os funcionários com ensino superior pode indicar que fatores como experiência profissional, área de atuação e cargos ocupados desempenham um papel fundamental na definição da remuneração dentro desse grupo.


8 - Calculando a Idade a Partir das variaveis Anos e Meses

8.1 - Anos+Meses/12:

Dados_Funcionarios$Idade <- Dados_Funcionarios$Anos+(Dados_Funcionarios$Meses/12) 
Dados_Funcionarios

9 - Análise da Relação entre as Variáveis Idade e Salário

9.1 - Gráfico de relação entre as variáveis:

plot(Dados_Funcionarios$Salario ~ Dados_Funcionarios$Idade,
        main = "Relação entre Salário e Idade",
        xlab = "Idade",
        ylab = "Salário",
        col="blue",
        las=1)

A partir dos pontos apresentados no gráfico, não parece haver uma relação direta entre a idade de um funcionário e seu salário uma vez que vemos pontos muito espalhados e sem um crescimento linear direto. O máximo que podemos observar é que os dois maiores salários se encontram em posso de funcionários na faixa de 40 a 50 anos.

valor de Correlação entre as Variáveis Idade e salário:

correlacao <- cor(Dados_Funcionarios$Idade, Dados_Funcionarios$Salario, use = "complete.obs")
print(correlacao)
[1] 0.3651397

Temos mais nitidamente, agora com um valor numérico, a evidência de que não há uma correlação forte entre essas duas variáveis, evidenciando assim o afirmado acima. Uma valor de 36% de relação mostra que pode até haver uma relação em determinados pontos, mas que é fraca e sem grande embasamento.

LS0tDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCiAgPGltZyBzcmM9Imh0dHBzOi8vZnVuZGFjLnBiLmdvdi5ici9kaXJldGFzL3NlY3JldGFyaWEtZGEtY2llbmNpYS10ZWNub2xvZ2lhLWlub3ZhY2FvLWUtZW5zaW5vLXN1cGVyaW9yL2ltYWdlbnMvbWFyY2EtZGEtdWVwYi1hcGxpY2FjYW8tY29sb3JpZGEtZW0tcG5nLTIucG5nL0BAaW1hZ2VzLzUzYTcyMGFkLTk5NjQtNDYyNS1iOTY3LTcwYjYzZTEwYzMxYS5wbmciIHdpZHRoPTIwMD48L2ltZz4NCjwvZGl2Pg0KDQo8aDIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPlVuaXZlcnNpZGFkZSBFc3RhZHVhbCBkYSBQYXJhw61iYSAtIFVFUEI8L2gyPg0KPGgzIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij5SZWxhdMOzcmlvIDEgZW0gUiAtIFByb2JhYmlsaWRhZGUgZSBFc3RhdMOtc3RpY2E8L2gzPg0KPGgzIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij5DZW50cm8gZGUgQ2nDqm5jaWFzIGUgVGVjbm9sb2dpYSAoQ0NUKTwvaDM+DQo8aDMgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPkRlcGFydGFtZW50byBkZSBDb21wdXRhw6fDo28gKERDKTwvaDM+DQoNCjxicj4NCg0KPGgzPjxzdHJvbmc+QWx1bm86PC9zdHJvbmc+IEFseXNzYW5kcm8gRHlvZ28gUGVyZWlyYSBSYW1vczwvaDM+DQpfX18NCg0KPGgyPjEgLSBDb25oZWNlbmRvIGEgQmFzZSBkZSBEYWRvczwvaDI+DQoNCmBgYHtyfQ0KRGFkb3NfRnVuY2lvbmFyaW9zDQpgYGANCg0KKkJhc2UgZGUgZGFkb3MgZGUgZnVuY2lvbsOhcmlvcy4qDQoNCl9fXw0KDQo8aDI+MiAtIEFuw6FsaXNlIGRhIERpc3RyaWJ1acOnw6NvIGRvIEVzdGFkbyBDaXZpbCBlbnRyZSBvcyBGdW5jaW9uw6FyaW9zPC9oMj4NCg0KPGg0PjIuMSAtIFRhYmVsYSBkZSBmcmVxdcOqbmNpYSBhYnNvbHV0YTo8L2g0Pg0KYGBge3J9DQpmcmVxX2Fic29sdXRhX2VzdGFkb19jaXZpbCA8LSB0YWJsZShEYWRvc19GdW5jaW9uYXJpb3MkRXN0LmNpdmlsKQ0KZnJlcV9yZWxhdGl2YV9lc3RhZG9fY2l2aWwgPC0gcHJvcC50YWJsZShmcmVxX2Fic29sdXRhX2VzdGFkb19jaXZpbCkNCg0KcHJpbnQoZnJlcV9hYnNvbHV0YV9lc3RhZG9fY2l2aWwpDQpgYGANCjxoND4yLjIgLSBUYWJlbGEgZGUgZnJlcXXDqm5jaWEgcmVsYXRpdmE6PC9oND4NCmBgYHtyfQ0KcHJpbnQoZnJlcV9yZWxhdGl2YV9lc3RhZG9fY2l2aWwpDQpgYGANCg0KDQpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NH0NCnBhcihtZnJvdyA9IGMoMSwyKSkNCg0KYmFycGxvdChmcmVxX2Fic29sdXRhX2VzdGFkb19jaXZpbCwgDQogICAgICAgIG1haW4gPSAiRnJlcXXDqm5jaWEgQWJzb2x1dGEgZGUgRXN0YWRvIENpdmlsIiwNCiAgICAgICAgeGxhYiA9ICJFc3RhZG8gQ2l2aWwiLA0KICAgICAgICB5bGFiID0gIkZyZXF1w6puY2lhIiwNCiAgICAgICAgY29sID0gcmFpbmJvdyhsZW5ndGgoZnJlcV9yZWxhdGl2YV9lc3RhZG9fY2l2aWwpKSwNCiAgICAgICAgbGFzPTEsDQogICAgICAgIGJvcmRlciA9ICJibGFjayIpDQoNCnBpZShmcmVxX3JlbGF0aXZhX2VzdGFkb19jaXZpbCwNCiAgICBtYWluID0gIkRpc3RyaWJ1acOnw6NvIGRvIEVzdGFkbyBDaXZpbCIsDQogICAgbGFzPTEsDQogICAgY29sID0gcmFpbmJvdyhsZW5ndGgoZnJlcV9yZWxhdGl2YV9lc3RhZG9fY2l2aWwpKSkNCg0KcGFyKG1mcm93ID0gYygxLDEpKQ0KDQpgYGANCjxwPg0KUG9kZW1vcyBvYnNlcnZhciB1bWEgZGlzcGFyaWRhZGUgbcOtbmltYSBuYSBkaXN0cmlidWnDp8OjbyBkb3MgZXN0YWRvcyBjb20gdW1hIGRpZmVyZW7Dp2EgZGUgYXByb3hpbWFkYW1lbnRlICoqMCw2JSoqIGVudHJlIGVsZXMuDQo8L3A+DQpfX18NCjxoMj4zIC0gQW7DoWxpc2UgZGEgRGlzdHJpYnVpw6fDo28gZG8gR3JhdSBkZSBJbnN0cnXDp8OjbyBlbnRyZSBvcyBGdW5jaW9uw6FyaW9zPC9oMj4NCg0KPGg0PjMuMSAtIFRhYmVsYSBkZSBmcmVxdcOqbmNpYSBhYnNvbHV0YSBkbyBncmF1IGRlIGluc3RydcOnw6NvIGRvcyBmdW5jaW9uw6FyaW9zOjwvaDQ+DQpgYGB7cn0NCmZyZXFfYWJzb2x1dGFfZ3JhdV9pbnN0cnVjYW8gPC0gdGFibGUoRGFkb3NfRnVuY2lvbmFyaW9zJEluc3QpDQpmcmVxX3JlbGF0aXZhX2dyYXVfaW5zdHJ1Y2FvIDwtIHByb3AudGFibGUoZnJlcV9hYnNvbHV0YV9ncmF1X2luc3RydWNhbykNCg0KcHJpbnQoZnJlcV9hYnNvbHV0YV9ncmF1X2luc3RydWNhbykNCmBgYA0KPGJyPjxicj4NCjxoND4zLjIgLSBUYWJlbGEgZGUgZnJlcXXDqm5jaWEgcmVsYXRpdmEgZG8gZ3JhdSBkZSBpbnN0cnXDp8OjbyBkb3MgZnVuY2lvbsOhcmlvczo8L2g0Pg0KYGBge3J9DQpwcmludChmcmVxX3JlbGF0aXZhX2dyYXVfaW5zdHJ1Y2FvKQ0KYGBgDQpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NH0NCmJhcnBsb3QoZnJlcV9hYnNvbHV0YV9ncmF1X2luc3RydWNhbywNCiAgICAgICAgbWFpbiA9ICJGcmVxdcOqbmNpYSBBYnNvbHV0YSBkbyBHcmF1IGRlIEluc3RydcOnw6NvIGRlIEZ1bmNpb27DoXJpb3MiLA0KICAgICAgICB4bGFiID0gIkdyYXUgZGUgSW5zdHJ1Y2FvIiwNCiAgICAgICAgeWxhYiA9ICJGcmVxdcOqbmNpYSIsDQogICAgICAgIGNvbCA9IChyYWluYm93KGxlbmd0aChmcmVxX3JlbGF0aXZhX2dyYXVfaW5zdHJ1Y2FvKSkpLA0KICAgICAgICBib3JkZXIgPSAiYmxhY2siLA0KICAgICAgICBsYXM9MSkNCnBpZShmcmVxX3JlbGF0aXZhX2dyYXVfaW5zdHJ1Y2FvLA0KICAgIG1haW4gPSAiRGlzdHJpYnVpw6fDo28gZG8gR3JhdSBkZSBpbnN0cnXDp8OjbyBkZSBGdW5jaW9uw6FyaW9zIiwNCiAgICBsYXM9MiwNCiAgICBjb2wgPSAocmFpbmJvdyhsZW5ndGgoZnJlcV9yZWxhdGl2YV9ncmF1X2luc3RydWNhbykpKSkNCg0KYGBgDQo8cD5Qb2RlbW9zIG9ic2VydmFyIHF1ZSBtZXRhZG8gZG9zIGZ1bmNpb27DoXJpb3MgcG9zc3VlbSBmb3JtYcOnw6NvIGF0w6kgbyAywrBncmF1IGUgYSBtaW5vcmlhLCBjb21wb25kbyBhcGVuYXMgcG91Y28gbWFpcyBkZSAqKjE2JSoqLCB0ZW0gbsOtdmVsIHN1cGVyaW9yLjwvcD4NCl9fXw0KPGgyPjQgLSBBbsOhbGlzZSBkYSBRdWFudGlkYWRlIGRlIEZpbGhvcyBkb3MgRnVuY2lvbsOhcmlvczwvaDI+DQoNCjxoND40LjEgLSBUYWJlbGEgZGUgRnJlcXXDqm5jaWEgQWJzb2x1dGEgZG8gTsO6bWVybyBkZSBGaWxob3M6PC9oND4NCmBgYHtyfQ0KZnJlcV9hYnNvbHV0YV9udW1fZmlsaG9zIDwtIHRhYmxlKERhZG9zX0Z1bmNpb25hcmlvcyRGaWxob3MpDQpwcmludChmcmVxX2Fic29sdXRhX251bV9maWxob3MpDQpgYGANCjxoND40LjIgLSBUYWJlbGEgZGUgRnJlcXXDqm5jaWEgUmVsYXRpdmEgZG8gTsO6bWVybyBkZSBGaWxob3M6PC9oND4NCmBgYHtyfQ0KZnJlcV9yZWxhdGl2YV9udW1fZmlsaG9zIDwtIHByb3AudGFibGUoZnJlcV9hYnNvbHV0YV9udW1fZmlsaG9zKQ0KcHJpbnQoZnJlcV9yZWxhdGl2YV9udW1fZmlsaG9zKQ0KYGBgDQo8aDQ+NC4zIC0gVGFiZWxhIGRlIEZyZXF1w6puY2lhIFJlbGF0aXZhIEFjdW11bGFkYSBkbyBOw7ptZXJvIGRlIEZpbGhvczo8L2g0Pg0KYGBge3J9DQpmcmVxX2Fic29sdXRhX2FjdW11bGFkYV9udW1fZmlsaG9zIDwtIGN1bXN1bShmcmVxX2Fic29sdXRhX251bV9maWxob3MpDQpwcmludChmcmVxX2Fic29sdXRhX2FjdW11bGFkYV9udW1fZmlsaG9zKQ0KYGBgDQo8YnI+PGJyPg0KPGg0PjQuNCAtIEdyw6FmaWNvIGRlIEZyZXF1w6puY2lhcyBSZWxhdGl2YXMgZG8gTsO6bWVybyBkZSBGaWxob3M8L2g0Pg0KYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9DQpiYXJwbG90KGZyZXFfcmVsYXRpdmFfbnVtX2ZpbGhvcywNCiAgICAgICAgbWFpbiA9ICJGcmVxdcOqbmNpYSBSZWxhdGl2YSBkbyBOw7ptZXJvIGRlIEZpbGhvcyBkZSBGdW5jaW9uw6FyaW9zIiwNCiAgICAgICAgeGxhYiA9ICJOw7ptZXJvIGRlIEZpbGhvcyIsDQogICAgICAgIHlsYWIgPSAiUHJvcG9yw6fDo28iLA0KICAgICAgICBjb2wgPSAocmFpbmJvdyhsZW5ndGgoZnJlcV9yZWxhdGl2YV9udW1fZmlsaG9zKSkpLA0KICAgICAgICBib3JkZXIgPSAiYmxhY2siLA0KICAgICAgICB5bGltID0gYygwLCAxKSwNCiAgICAgICAgbGFzPTEpDQoNCmJhcnBsb3QoY3Vtc3VtKGZyZXFfcmVsYXRpdmFfbnVtX2ZpbGhvcyksDQogICAgICAgIG1haW4gPSAiRnJlcXXDqm5jaWEgUmVsYXRpdmEgQWN1bXVsYWRhIGRvIE7Dum1lcm8gZGUgRmlsaG9zIGRlIEZ1bmNpb27DoXJpb3MiLA0KICAgICAgICB4bGFiID0gIk7Dum1lcm8gZGUgRmlsaG9zIiwNCiAgICAgICAgeWxhYiA9ICJQcm9wb3LDp8OjbyBBY3VtdWxhZGEgZG8gTsO6bWVybyBkZSBGaWxob3MiLA0KICAgICAgICBjb2wgPSAocmFpbmJvdyhsZW5ndGgoZnJlcV9yZWxhdGl2YV9udW1fZmlsaG9zKSkpLA0KICAgICAgICBib3JkZXIgPSAiYmxhY2siLA0KICAgICAgICB5bGltID0gYygwLCAxKSwNCiAgICAgICAgbGFzPTEpDQoNCmBgYA0KPHA+UG9kZW1vcyBvYnNlcnZhciBxdWUgKio4MCUqKiBkb3MgZnVuY2lvbsOhcmlvcyBwb3NzdWVtIDIgZmlsaG9zIG91IG1lbm9zIGUgYXBlbmFzICoqMjAlKiogcG9zc3VlbSAzIG91IDUgZmlsaG9zLiBEZXZlbW9zIG9ic2VydmFyIGFpbmRhIHF1ZSAxNiBkb3MgZnVuY2lvbsOhcmlvcyBuw6NvIHBvc3N1ZW0gaW5mb3JtYcOnw7VlcyBxdWFudG8gYW8gbsO6bWVybyBkZSBmaWxob3MsIG91IHNlamEsIGEgbWFyZ2VtIGRlIGFuw6FsaXNlIGZvaSBkZSBhcGVuYXMgMjAgZG9zIDM2IGZ1bmNpb27DoXJpb3MuPC9wPg0KX19fDQo8aDI+NSAtIEFuw6FsaXNlIFNvYnJlIG8gU2Fsw6FyaW8gZG9zIEZ1bmNpb27DoXJpb3M8L2gyPg0KPGg0PjUuMSAtIFZhbG9yIE3DoXhpbW8gZGUgc2Fsw6FyaW8gRGVudHJlIG9zIEZ1bmNpb27DoXJpb3MgKHgxMDAwIFIkKTo8L2g0Pg0KDQpgYGB7cn0gDQp2YWxvcl9tYXhpbW9fc2FsYXJpbyA8LSBtYXgoRGFkb3NfRnVuY2lvbmFyaW9zJFNhbGFyaW8pIA0KcHJpbnQodmFsb3JfbWF4aW1vX3NhbGFyaW8pDQpgYGANCjxoND41LjIgLSBWYWxvciBNw61uaW1vIGRlIFNhbMOhcmlvIERlbnRyZSBvcyBGdW5jaW9uw6FyaW9zICh4MTAwMCBSJCk6PC9oND4gDQpgYGB7cn0gDQp2YWxvcl9taW5pbW9fc2FsYXJpbyA8LSBtaW4oRGFkb3NfRnVuY2lvbmFyaW9zJFNhbGFyaW8pIA0KcHJpbnQodmFsb3JfbWluaW1vX3NhbGFyaW8pDQpgYGANCjxoND41LjMgLSBRdWFudGlkYWRlIElkZWFsIGRlIENsYXNzZXMgcGFyYSBUYWJlbGEgZGUgRnJlcXXDqm5jaWEgLSBSZWdyYSBkZSBTdHVnZXM6PC9oND4gDQpgYGB7cn0gDQp0b3RhbF9zYWxhcmlvcyA8LSBsZW5ndGgoRGFkb3NfRnVuY2lvbmFyaW9zJFNhbGFyaW8pIA0KSyA8LSByb3VuZCgxICsgKDMuMyAqIGxvZzEwKHRvdGFsX3NhbGFyaW9zKSkpIA0KcHJpbnQoSykNCmBgYA0KPGg0PjUuNCAtIEhpc3RvZ3JhbWEgZG8gU2Fsw6FyaW8gZGUgRnVuY2lvbsOhcmlvczo8L2g0PiANCmBgYHtyfSANCmhpc3QoRGFkb3NfRnVuY2lvbmFyaW9zJFNhbGFyaW8sIA0KICBicmVha3MgPSBLLCANCiAgbWFpbiA9ICJIaXN0b2dyYW1hIERvIFNhbMOhcmlvIGRlIEZ1bmNpb27DoXJpb3MiLCANCiAgeGxhYiA9ICJTYWzDoXJpbyIsIA0KICB5bGFiID0gIkZyZXF1w6puY2lhIiwgDQogIGNvbCA9ICJsaWdodGJsdWUiLCANCiAgYm9yZGVyID0gImJsYWNrIiwgDQogIHlsaW0gPSBjKDAsIDIwKSwgDQogIGxhcz0xKSANCmBgYA0KPGg0PjUuNSAtIE1lZGlkYXMgRXN0YXTDrXN0aWNhcyBkbyBTYWzDoXJpbzo8L2g0PiANCmBgYHtyfSANCm1lZGlhX3NhbGFyaW8gPC0gbWVhbihEYWRvc19GdW5jaW9uYXJpb3MkU2FsYXJpbykgDQp2YXJpYW5jaWFfc2FsYXJpbyA8LSB2YXIoRGFkb3NfRnVuY2lvbmFyaW9zJFNhbGFyaW8pIA0KZGVzdmlvX3BhZHJhb19zYWxhcmlvIDwtIHNkKERhZG9zX0Z1bmNpb25hcmlvcyRTYWxhcmlvKSANCm1lZGlhbmFfc2FsYXJpbyA8LSBtZWRpYW4oRGFkb3NfRnVuY2lvbmFyaW9zJFNhbGFyaW8pIA0KcXVhbnRpc19zYWxhcmlvIDwtIHF1YW50aWxlKERhZG9zX0Z1bmNpb25hcmlvcyRTYWxhcmlvLCBwcm9icyA9IGMoMC4yNSwgMC41LCAwLjc1KSkNCnByaW50KHBhc3RlKCJNw6lkaWEgZG8gU2Fsw6FyaW8oeDEwMDAgUiQpOiIsIHJvdW5kKG1lZGlhX3NhbGFyaW8sIDIpKSkNCnByaW50KHBhc3RlKCJWYXJpw6JuY2lhIGRvIFNhbMOhcmlvKHgxMDAwIFIkKToiLCByb3VuZCh2YXJpYW5jaWFfc2FsYXJpbywgMikpKQ0KcHJpbnQocGFzdGUoIkRlc3ZpbyBQYWRyw6NvIGRvIFNhbMOhcmlvKHgxMDAwIFIkKToiLCByb3VuZChkZXN2aW9fcGFkcmFvX3NhbGFyaW8sIDIpKSkNCnByaW50KHBhc3RlKCJNZWRpYW5hIGRvIFNhbMOhcmlvKHgxMDAwIFIkKToiLCByb3VuZChtZWRpYW5hX3NhbGFyaW8sIDIpKSkNCnByaW50KHBhc3RlKCJRdWFudGlzIGRvIFNhbMOhcmlvICgyNSUpOiIsIHF1YW50aXNfc2FsYXJpb1sxXSkpDQpwcmludChwYXN0ZSgiUXVhbnRpcyBkbyBTYWzDoXJpbyAoNTAlKToiLCBxdWFudGlzX3NhbGFyaW9bMl0pKQ0KcHJpbnQocGFzdGUoIlF1YW50aXMgZG8gU2Fsw6FyaW8gKDc1JSk6IiwgcXVhbnRpc19zYWxhcmlvWzNdKSkNCmBgYA0KPHA+QSBkaXN0cmlidWnDp8OjbyBzYWxhcmlhbCBkb3MgZnVuY2lvbsOhcmlvcyBhcHJlc2VudGEgdW1hIGxldmUgdGVuZMOqbmNpYSDDoCBkaXJlaXRhLCBjb20gYSBtw6lkaWEgZGUgKipSJDExLDEyIG1pbCoqIG1haW9yIHF1ZSBhIG1lZGlhbmEgZGUgKipSJDEwLDE2NSBtaWwqKiwgaW5kaWNhbmRvIGEgaW5mbHXDqm5jaWEgZGUgc2Fsw6FyaW9zIG1haXMgYWx0b3MgcXVlIGxldmFtIGEgdW1hIGVsZXZhw6fDo28uIEEgbWFpb3JpYSBkb3Mgc2Fsw6FyaW9zIHNlIGNvbmNlbnRyYSBlbnRyZSAqKlIkNyw1NSBtaWwgZSBSJDE0LDA2IG1pbCoqLCBjb20gdW0gZGVzdmlvIHBhZHLDo28gZGUgKio0LDU5KiosIHJlZmxldGluZG8gdW1hIGRpc3BlcnPDo28gbW9kZXJhZGEuIE8gaGlzdG9ncmFtYSBjb25maXJtYSBlc3NhIGRpc3RyaWJ1acOnw6NvLCBtb3N0cmFuZG8gdW0gcGljbyBlbnRyZSAqKlIkNSBtaWwgZSBSJDE1IG1pbCoqLCBjb20gcG91Y29zIHZhbG9yZXMgZXh0cmVtb3Mgw6AgZGlyZWl0YSBlIMOgIGVzcXVlcmRhIGRvIGhpc3RvZ3JhbWEuPC9wPg0KX19fDQo8aDI+NiAtIEFuw6FsaXNlIGRhIFJlbGHDp8OjbyBlbnRyZSBvIEVzdGFkbyBDaXZpbCBkb3MgRnVuY2lvbsOhcmlvcyBlIHNldSBHcmF1IGRlIEluc3RydcOnw6NvPC9oMj4NCg0KPGg0PjYuMSAtVGFiZWxhIGRlIENvbnRpbmfDqm5jaWEgUmVsYWNpb25hbmRvIG8gRXN0YWRvIENpdmlsIGUgbyBHcmF1IGRlIEluc3RydcOnw6NvOjwvaDQ+DQoNCmBgYHtyfQ0KdGFiZWxhX2NvbnRpZ2VuY2lhX2VzdGFkb0NpdmlsX2dyYXVJbnN0cnVjYW8gPC0gdGFibGUoRGFkb3NfRnVuY2lvbmFyaW9zJEVzdC5jaXZpbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhZG9zX0Z1bmNpb25hcmlvcyRJbnN0KQ0KcHJpbnQodGFiZWxhX2NvbnRpZ2VuY2lhX2VzdGFkb0NpdmlsX2dyYXVJbnN0cnVjYW8pDQpgYGANCjxwPlBvZGVtb3Mgb2JzZXJ2YXIgdW1hIGRpc3BhcmlkYWRlIHJlbGV2YW50ZSBlbnRyZSBvcyBmdW5jaW9uw6FyaW9zIGRlIGZvcm1hw6fDo28gYXTDqSAgKioywrAgZ3JhdSoqIG9uZGUgbyBkb2JybyBkZWxlcyDDqSBjYXNhZG8uIENvbnR1ZG8sIG5hcyBkZW1haXMsIGVzc2EgZGlzcGFyaWRhZGUgbsOjbyBzZSBhcHJlc2VudGEsIG5vcyBkZSAqKjHCsGdyYXUqKiB0ZW1vcyB1bWEgZGlmZXJlbsOnYSBkZSBhcGVuYXMgMSBlbnRyZSBvcyBjYXNhZG9zIGUgc29sdGVpcm9zLiBOb3MgZGUgZm9ybWHDp8OjbyBzdXBlcmlvciBzZXF1ZXIgaMOhIGRpZmVyw6puY2lhLiBUYWx2ZXogaXNzbyBwb3NzYSBzdWdlcmlyIHVtYSByZWxhw6fDo28gZW50cmUgYSBpZGFkZSBkb3MgZnVuY2lvbsOhcmlvcyBjb20gc2V1IGdyYXUgZGUgaW5zdHJ1w6fDo28sIGNvbnR1ZG8gYXBlbmFzIGNvbSBiYXNlIG5lc3NlcyBkYWRvcyBuw6NvIGjDoSByZXN1bHRhZG9zIGNvbmNsdXNpdm9zLjwvcD4NCjxoND42LjIgLSBHcsOhZmljbyBkZSBSZWxhw6fDo28gZW50cmUgRXN0YWRvIENpdmlsIGUgR3JhdSBkZSBJbnN0cnXDp8Ojbzo8L2g0Pg0KYGBge3J9DQpjb3JlcyA8LSByYWluYm93KG5yb3codGFiZWxhX2NvbnRpZ2VuY2lhX2VzdGFkb0NpdmlsX2dyYXVJbnN0cnVjYW8pKQ0KDQpiYXJwbG90KHRhYmVsYV9jb250aWdlbmNpYV9lc3RhZG9DaXZpbF9ncmF1SW5zdHJ1Y2FvLA0KICAgICAgICBiZXNpZGUgPSBGQUxTRSwNCiAgICAgICAgbWFpbiA9ICJHcsOhZmljbyBkZSBDcnV6YW1lbnRvIGRvIEVzdGFkbyBDaXZpbCBlIEdyYXUgZGUgSW5zdHJ1w6fDo28gU29icmVwb3N0b3MiLA0KICAgICAgICB4bGFiID0gIkdyYXUgZGUgSW5zdHJ1w6fDo28iLA0KICAgICAgICB5bGFiID0gIkZyZXF1w6puY2lhIiwNCiAgICAgICAgeWxpbSA9IGMoMCwgMjApLA0KICAgICAgICBjb2wgPSBjb3JlcywNCiAgICAgICAgbGFzPTEpDQoNCmxlZ2VuZCgidG9wcmlnaHQiLA0KICAgICAgIGxlZ2VuZCA9IHJvd25hbWVzKHRhYmVsYV9jb250aWdlbmNpYV9lc3RhZG9DaXZpbF9ncmF1SW5zdHJ1Y2FvKSwNCiAgICAgICBmaWxsID0gY29yZXMsDQogICAgICAgdGl0bGUgPSAiRXN0YWRvIENpdmlsIikNCg0KYmFycGxvdCh0YWJlbGFfY29udGlnZW5jaWFfZXN0YWRvQ2l2aWxfZ3JhdUluc3RydWNhbywNCiAgICAgICAgYmVzaWRlID0gVFJVRSwNCiAgICAgICAgbWFpbiA9ICJHcsOhZmljbyBkZSBDcnV6YW1lbnRvIGRvIEVzdGFkbyBDaXZpbCBlIEdyYXUgZGUgSW5zdHJ1w6fDo28gTGFkbyBhIExhZG8iLA0KICAgICAgICB4bGFiID0gIkdyYXUgZGUgSW5zdHJ1w6fDo28iLA0KICAgICAgICB5bGFiID0gIkZyZXF1w6puY2lhIiwNCiAgICAgICAgeWxpbSA9IGMoMCwgMjApLA0KICAgICAgICBjb2wgPSBjb3JlcywNCiAgICAgICAgbGFzPTEpDQoNCmxlZ2VuZCgidG9wcmlnaHQiLA0KICAgICAgIGxlZ2VuZCA9IHJvd25hbWVzKHRhYmVsYV9jb250aWdlbmNpYV9lc3RhZG9DaXZpbF9ncmF1SW5zdHJ1Y2FvKSwNCiAgICAgICBmaWxsID0gY29yZXMsDQogICAgICAgdGl0bGUgPSAiRXN0YWRvIENpdmlsIikNCg0KYGBgDQo8cD5PcyBncsOhZmljb3MgYXBlbmFzIHNlZ3VlbSBhIHJlZm9yw6dhciBhIGFuw6FsaXNlIGFudGVyaW9yLiBQb2RlIGhhdmVyIHVtYSByZWxhw6fDo28sIGNvbnR1ZG8gc2VtIHJlc3VsdGFkb3MgY29uY2x1c2l2b3MgZGFkYSBhIHF1YW50aWRhZGUgZGUgZGFkb3MuPC9wPg0KX19fDQo8aDI+NyAtIEFuw6FsaXNlIGRlIFJlbGHDp8OjbyBlbnRyZSBHcmF1IGRlIEluc3RydcOnw6NvIGUgU2Fsw6FyaW8gZG9zIEZ1bmNpb27DoXJpb3M8L2gyPg0KDQo8aDQ+Ny4xIC0gQm94cGxvdCBwYXJhIFZlcmlmaWNhw6fDo28gZGUgUmVsYcOnw6NvIGVudHJlIGFzIFZhcmnDoXZlaXM6PC9oND4NCmBgYHtyfQ0KYm94cGxvdChEYWRvc19GdW5jaW9uYXJpb3MkU2FsYXJpbyB+IERhZG9zX0Z1bmNpb25hcmlvcyRJbnN0LA0KICAgICAgICBtYWluID0gIkRpc3RyaWJ1acOnw6NvIFNhbGFyaWFsIHBvciBHcmF1IGRlIEluc3RydcOnw6NvIiwNCiAgICAgICAgeGxhYiA9ICJHcmF1IGRlIEluc3RydcOnw6NvIiwNCiAgICAgICAgeWxhYiA9ICJTYWzDoXJpbyIsDQogICAgICAgIGNvbCA9ICJsaWdodGJsdWUiLA0KICAgICAgICBub3RjaCA9IEZBTFNFLA0KICAgICAgICBsYXM9MSkNCmBgYA0KPHA+TyBib3hwbG90IGV2aWRlbmNpYSB1bWEgcmVsYcOnw6NvIGNsYXJhIGVudHJlIG8gZ3JhdSBkZSBpbnN0cnXDp8OjbyBkb3MgZnVuY2lvbsOhcmlvcyBjb20gc2V1cyByZXNwZWN0aXZvcyBzYWzDoXJpb3MuIFBvZGVtb3Mgb2JzZXJ2YXIgcXVlIHBhcmEgY2FkYSBncmF1IGRlIGluc3RydcOnw6NvLCBtZXNtbyBvIG1lbm9yIHZhbG9yIGRlc3NlLCBzZW1wcmUgYWNhYmEgcG9yIHNlciBhcHJveGltbyBkbyB2YWxvciBtw6F4aW1vIGRlIHNhbMOhcmlvIGRvIGdyYXUgZGUgaW5zdHJ1w6fDo28gbWFpcyBiYWl4byBxdWUgbyBhbnRlY2VkZSwgYWzDqW0gZG8gcXVlIG9zIGZ1bmNpb27DoXJpb3MgZGUgbsOtdmVsIHN1cGVyaW9yIHNlIGRlc3RhY2FtIGNvbSAgb3Mgc2Fsw6FyaW9zIG1haXMgYWx0b3MsIGVucXVhbnRvIHF1ZSBvcyBkZSAqKjLCsGdyYXUqKiBmaWNhbSBjb20gdW1hIGZhaXhhIG1haXMgcHLDs3hpbWEgYW8gbWVpbyBlIG9zIGRlICoqMcKwIGdyYXUqKiBjb20gb3MgbWFpcyBiYWl4b3MsIHNlcXVlciBjaGVnYW5kbyBhb3MgKipSJDEwIG1pbCoqIHF1ZSDDqSBtZW5vcyBxdWUgYSBtw6lkaWEgZG9zIGRlICoqMsKwIGdyYXUqKi48L3A+DQoNCjxoND43LjIgLSBNZWRpZGFzIGVzdGF0w61zdGljYXMgZG9zIFNhbMOhcmlvcyBwYXJhIGNhZGEgR3JhdSBkZSBJbnN0cnXDp8OjbzoNCmBgYHtyfQ0KbWVkaWFfc2FsYXJpYV9wb3JfZ3JhdV9pbnN0cnVjYW8gPC0gdGFwcGx5KERhZG9zX0Z1bmNpb25hcmlvcyRTYWxhcmlvLCBEYWRvc19GdW5jaW9uYXJpb3MkSW5zdCwgbWVhbiwgbmEucm09VFJVRSkgDQpkZXN2aW9fcGFkcmFvX3Bvcl9ncmF1X2luc3RydWNhbyA8LSB0YXBwbHkoRGFkb3NfRnVuY2lvbmFyaW9zJFNhbGFyaW8sIERhZG9zX0Z1bmNpb25hcmlvcyRJbnN0LCBzZCwgbmEucm09VFJVRSkgDQp2YXJfc2FsYXJpb19wb3JfZ3JhdV9pbnN0cnVjYW8gPC0gdGFwcGx5KERhZG9zX0Z1bmNpb25hcmlvcyRTYWxhcmlvLCBEYWRvc19GdW5jaW9uYXJpb3MkSW5zdCwgdmFyLCBuYS5ybT1UUlVFKSANCm1lZGlhbmFzX3NhbGFyaW9fcG9yX2dyYXVfaW5zdHJ1Y2FvIDwtIHRhcHBseShEYWRvc19GdW5jaW9uYXJpb3MkU2FsYXJpbywgRGFkb3NfRnVuY2lvbmFyaW9zJEluc3QsIG1lZGlhbiwgbmEucm09VFJVRSkNCnF1YXJ0aXNfc2FsYXJpb19wb3JfZ3JhdV9pbnN0cnVjYW8gPC0gdGFwcGx5KERhZG9zX0Z1bmNpb25hcmlvcyRTYWxhcmlvLCBEYWRvc19GdW5jaW9uYXJpb3MkSW5zdCwgcXVhbnRpbGUsIHByb2JzID0gYygwLCAwLjI1LCAwLjUsIDAuNzUsIDEpLCBuYS5ybT1UUlVFKQ0KDQpncmF1c19pbnN0cnVjYW8gPC0gYygiMcKwIEdyYXUiLCAiMsKwIEdyYXUiLCAiU3VwZXJpb3IiKQ0KDQpjYXQoIlxuTcOpZGlhIFNhbGFyaWFsIHBvciBHcmF1IGRlIEluc3RydcOnw6NvOlxuIikNCmZvciAoaSBpbiBzZXFfYWxvbmcoZ3JhdXNfaW5zdHJ1Y2FvKSkgew0KICBjYXQoc3ByaW50ZigiJXM6ICUuMmZcbiIsIGdyYXVzX2luc3RydWNhb1tpXSwgbWVkaWFfc2FsYXJpYV9wb3JfZ3JhdV9pbnN0cnVjYW9baV0pKQ0KfQ0KDQpjYXQoIlxuVmFyacOibmNpYSBTYWxhcmlhbCBwb3IgR3JhdSBkZSBJbnN0cnXDp8OjbzpcbiIpDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGdyYXVzX2luc3RydWNhbykpIHsNCiAgY2F0KHNwcmludGYoIiVzOiAlLjJmXG4iLCBncmF1c19pbnN0cnVjYW9baV0sIHZhcl9zYWxhcmlvX3Bvcl9ncmF1X2luc3RydWNhb1tpXSkpDQp9DQoNCmNhdCgiXG5EZXN2aW8gUGFkcsOjbyBTYWxhcmlhbCBwb3IgR3JhdSBkZSBJbnN0cnXDp8OjbzpcbiIpDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGdyYXVzX2luc3RydWNhbykpIHsNCiAgY2F0KHNwcmludGYoIiVzOiAlLjJmXG4iLCBncmF1c19pbnN0cnVjYW9baV0sIGRlc3Zpb19wYWRyYW9fcG9yX2dyYXVfaW5zdHJ1Y2FvW2ldKSkNCn0NCg0KY2F0KCJcbk1lZGlhbmEgU2FsYXJpYWwgcG9yIEdyYXUgZGUgSW5zdHJ1w6fDo286XG4iKQ0KZm9yIChpIGluIHNlcV9hbG9uZyhncmF1c19pbnN0cnVjYW8pKSB7DQogIGNhdChzcHJpbnRmKCIlczogJS4yZlxuIiwgZ3JhdXNfaW5zdHJ1Y2FvW2ldLCBtZWRpYW5hc19zYWxhcmlvX3Bvcl9ncmF1X2luc3RydWNhb1tpXSkpDQp9DQoNCmNhdCgiXG5RdWFydGlzIFNhbGFyaWFsIHBvciBHcmF1IGRlIEluc3RydcOnw6NvOlxuIikNCmZvciAoaSBpbiBzZXFfYWxvbmcoZ3JhdXNfaW5zdHJ1Y2FvKSkgew0KICBxdWFydGlzIDwtIHF1YXJ0aXNfc2FsYXJpb19wb3JfZ3JhdV9pbnN0cnVjYW9bW2ldXSAgIyBFeHRyYWkgbyB2ZXRvciBkZSBxdWFydGlzDQogIGNhdChzcHJpbnRmKA0KICAgICIlczpcbiAgTcOtbmltbzogJS4yZlxuICAxwrogUXVhcnRpbCAoUTEpOiAlLjJmXG4gIE1lZGlhbmEgKFEyKTogJS4yZlxuICAzwrogUXVhcnRpbCAoUTMpOiAlLjJmXG4gIE3DoXhpbW86ICUuMmZcblxuIiwgDQogICAgZ3JhdXNfaW5zdHJ1Y2FvW2ldLCBxdWFydGlzWzFdLCBxdWFydGlzWzJdLCBxdWFydGlzWzNdLCBxdWFydGlzWzRdLCBxdWFydGlzWzVdDQogICkpDQp9DQpgYGANCjxwPlBvZGVtb3Mgb2JzZXJ2YXIgbWFpcyBjbGFyYW1lbnRlIG9zIHJlc3VsdGFkb3MgYW5hbGlzYWRvcyBubyBib3hwbG90LCBhZ29yYSBjb20gYSBtw6lkaWEgc2FsYXJpYWwgcGFyYSBjYWRhIGdyYXUgZGUgaW5zdHJ1w6fDo28uIFRlbW9zIHVtYSBkaWZlcmVuw6dhIGRlIG1haXMgZGUgUiQzIG1pbCBlbnRyZSBhcyBtw6lkaWFzIHNhbGFyaWFpcyBkb3MgZnVuY2lvbsOhcmlvcyBkZSBncmF1IGRlIGluc3RydcOnw6NvIGF0w6kgbyAqKjHCsCBncmF1KiogZSBvcyBkZSAqKjLCsCBncmF1KiouIErDoSBlbnRyZSBvcyBkZSAqKjLCsCBncmF1KiogZSBzdXBlcmlvciwgYSBkaWZlcmVuw6dhIMOpIGFpbmRhIG1haW9yLCBjaGVnYW5kbyBhIHF1YXNlICoqUiQ1IG1pbCoqLg0KDQpBbMOpbSBkaXNzbywgb3MgdmFsb3JlcyBzYWxhcmlhaXMgc2UgdG9ybmFtIG1lbm9zIGhvbW9nw6puZW9zIMOgIG1lZGlkYSBxdWUgbyBncmF1IGRlIGluc3RydcOnw6NvIGF1bWVudGEuIE8gZGVzdmlvIHBhZHLDo28gZG9zIHNhbMOhcmlvcyDDqSBtYWlvciBwYXJhIG9zIGZ1bmNpb27DoXJpb3MgY29tIGVuc2lubyBzdXBlcmlvciAoUiQ0LDUwIG1pbCkgZW0gY29tcGFyYcOnw6NvIGFvcyBkZSBlbnNpbm8gbcOpZGlvICoqUiQzLDcyIG1pbCoqIGUgZnVuZGFtZW50YWwgKipSJDIsOTYgbWlsKiosIGluZGljYW5kbyBxdWUgb3Mgc2Fsw6FyaW9zIG5lc3NlIGdydXBvIHZhcmlhbSBtYWlzLg0KDQpBbyBhbmFsaXNhciBvcyBxdWFydGlzIHNhbGFyaWFpcywgZmljYSBldmlkZW50ZSBxdWUgYSBtYWlvcmlhIGRvcyBmdW5jaW9uw6FyaW9zIGNvbSBlbnNpbm8gc3VwZXJpb3IgZ2FuaGEgbWFpcyBkbyBxdWUgYXF1ZWxlcyBjb20gZXNjb2xhcmlkYWRlIGluZmVyaW9yLiBPIHByaW1laXJvIHF1YXJ0aWwgKipRMSoqIGRvIGVuc2lubyBzdXBlcmlvciBqw6EgZXN0w6EgYWNpbWEgZG8gdGVyY2Vpcm8gcXVhcnRpbCAqKlEzKiogZG8gZW5zaW5vIGZ1bmRhbWVudGFsLCBvIHF1ZSBzaWduaWZpY2EgcXVlICoqNzUlKiogZG9zIGZ1bmNpb27DoXJpb3MgY29tIGVuc2lubyBzdXBlcmlvciBnYW5oYW0gbWFpcyBkbyBxdWUgKio3NSUqKiBkb3MgZnVuY2lvbsOhcmlvcyBjb20gZW5zaW5vIGZ1bmRhbWVudGFsLiBJc3NvIG1vc3RyYSB1bWEgZGVzaWd1YWxkYWRlIHNpZ25pZmljYXRpdmEgZSByZWZvcsOnYSBvIGltcGFjdG8gZG8gZ3JhdSBkZSBpbnN0cnXDp8OjbyBub3Mgc2Fsw6FyaW9zLg0KDQpQb3IgZmltLCBhIG1haW9yIGRpc3BlcnPDo28gc2FsYXJpYWwgZW50cmUgb3MgZnVuY2lvbsOhcmlvcyBjb20gZW5zaW5vIHN1cGVyaW9yIHBvZGUgaW5kaWNhciBxdWUgZmF0b3JlcyBjb21vIGV4cGVyacOqbmNpYSBwcm9maXNzaW9uYWwsIMOhcmVhIGRlIGF0dWHDp8OjbyBlIGNhcmdvcyBvY3VwYWRvcyBkZXNlbXBlbmhhbSB1bSBwYXBlbCBmdW5kYW1lbnRhbCBuYSBkZWZpbmnDp8OjbyBkYSByZW11bmVyYcOnw6NvIGRlbnRybyBkZXNzZSBncnVwby48L3A+DQpfX18NCjxoMj44IC0gQ2FsY3VsYW5kbyBhIElkYWRlIGEgUGFydGlyIGRhcyB2YXJpYXZlaXMgQW5vcyBlIE1lc2VzPC9oMj4NCjxoND44LjEgLSBBbm9zK01lc2VzLzEyOjwvaDQ+DQpgYGB7cn0NCkRhZG9zX0Z1bmNpb25hcmlvcyRJZGFkZSA8LSBEYWRvc19GdW5jaW9uYXJpb3MkQW5vcysoRGFkb3NfRnVuY2lvbmFyaW9zJE1lc2VzLzEyKSANCkRhZG9zX0Z1bmNpb25hcmlvcw0KYGBgDQpfX18NCjxoMj45IC0gQW7DoWxpc2UgZGEgUmVsYcOnw6NvIGVudHJlIGFzIFZhcmnDoXZlaXMgSWRhZGUgZSBTYWzDoXJpbzwvaDI+DQo8aDQ+OS4xIC0gR3LDoWZpY28gZGUgcmVsYcOnw6NvIGVudHJlIGFzIHZhcmnDoXZlaXM6PC9oND4NCmBgYHtyfQ0KcGxvdChEYWRvc19GdW5jaW9uYXJpb3MkU2FsYXJpbyB+IERhZG9zX0Z1bmNpb25hcmlvcyRJZGFkZSwNCiAgICAgICAgbWFpbiA9ICJSZWxhw6fDo28gZW50cmUgU2Fsw6FyaW8gZSBJZGFkZSIsDQogICAgICAgIHhsYWIgPSAiSWRhZGUiLA0KICAgICAgICB5bGFiID0gIlNhbMOhcmlvIiwNCiAgICAgICAgY29sPSJibHVlIiwNCiAgICAgICAgbGFzPTEpDQpgYGANCjxwPkEgcGFydGlyIGRvcyBwb250b3MgYXByZXNlbnRhZG9zIG5vIGdyw6FmaWNvLCBuw6NvIHBhcmVjZSBoYXZlciB1bWEgcmVsYcOnw6NvIGRpcmV0YSBlbnRyZSBhIGlkYWRlIGRlIHVtIGZ1bmNpb27DoXJpbyBlIHNldSBzYWzDoXJpbyB1bWEgdmV6IHF1ZSB2ZW1vcyBwb250b3MgbXVpdG8gZXNwYWxoYWRvcyBlIHNlbSB1bSBjcmVzY2ltZW50byBsaW5lYXIgZGlyZXRvLiBPIG3DoXhpbW8gcXVlIHBvZGVtb3Mgb2JzZXJ2YXIgw6kgcXVlIG9zIGRvaXMgbWFpb3JlcyBzYWzDoXJpb3Mgc2UgZW5jb250cmFtIGVtIHBvc3NvIGRlIGZ1bmNpb27DoXJpb3MgbmEgZmFpeGEgZGUgKio0MCBhIDUwKiogYW5vcy48L3A+DQoNCjxoND52YWxvciBkZSBDb3JyZWxhw6fDo28gZW50cmUgYXMgVmFyacOhdmVpcyBJZGFkZSBlIHNhbMOhcmlvOjwvaDQ+DQpgYGB7cn0NCmNvcnJlbGFjYW8gPC0gY29yKERhZG9zX0Z1bmNpb25hcmlvcyRJZGFkZSwgRGFkb3NfRnVuY2lvbmFyaW9zJFNhbGFyaW8sIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KcHJpbnQoY29ycmVsYWNhbykNCmBgYA0KPHA+VGVtb3MgbWFpcyBuaXRpZGFtZW50ZSwgYWdvcmEgY29tIHVtIHZhbG9yIG51bcOpcmljbywgYSBldmlkw6puY2lhIGRlIHF1ZSBuw6NvIGjDoSB1bWEgY29ycmVsYcOnw6NvIGZvcnRlIGVudHJlIGVzc2FzIGR1YXMgdmFyacOhdmVpcywgZXZpZGVuY2lhbmRvIGFzc2ltIG8gYWZpcm1hZG8gYWNpbWEuIFVtYSB2YWxvciBkZSAqKjM2JSoqIGRlIHJlbGHDp8OjbyBtb3N0cmEgcXVlIHBvZGUgYXTDqSBoYXZlciB1bWEgcmVsYcOnw6NvIGVtIGRldGVybWluYWRvcyBwb250b3MsIG1hcyBxdWUgw6kgZnJhY2EgZSBzZW0gZ3JhbmRlIGVtYmFzYW1lbnRvLjwvcD4=