Dados da CAPES sobre avaliação da pós-graduação
A CAPES é um órgão do MEC que tem a atribuição de acompanhar a
pós-graduação na universidade brasileira. Uma das formas que ela
encontrou de fazer isso e pela qual ela é bastante criticada é através
de uma avaliação quantitativa a cada x anos (era 3, mudou para 4).
Usaremos dados da penúltima avaliação da CAPES:
cacc_tudo = read.csv('cacc.csv')
glimpse(cacc_tudo)
Rows: 73
Columns: 31
$ Instituição <chr> "UNIVERSIDADE FEDERAL…
$ Programa <chr> "INFORMÁTICA (1200101…
$ Nível <int> 5, 4, 3, 3, 3, 5, 4, …
$ Sigla <chr> "UFAM", "UFPA", "UFMA…
$ Tem.doutorado <chr> "Sim", "Sim", "Não", …
$ Docentes.colaboradores <dbl> 0.25, 5.50, 3.00, 6.2…
$ Docentes.permanentes <dbl> 24.75, 14.00, 10.00, …
$ Docentes.visitantes <dbl> 0.00, 0.00, 0.00, 0.0…
$ Resumos.em.conf <int> 20, 23, 15, 5, 4, 10,…
$ Resumos.expandidos.em.conf <int> 25, 24, 7, 10, 1, 68,…
$ Artigos.em.conf <int> 390, 284, 115, 73, 15…
$ Dissertacoes <int> 108, 77, 50, 25, 31, …
$ Teses <int> 14, 0, 0, 0, 0, 24, 5…
$ periodicos_A1 <int> 15, 19, 5, 1, 7, 21, …
$ periodicos_A2 <int> 19, 21, 11, 1, 4, 32,…
$ periodicos_B1 <int> 19, 38, 7, 3, 6, 26, …
$ periodicos_B2 <int> 1, 12, 2, 6, 0, 0, 11…
$ periodicos_B3 <int> 3, 16, 2, 2, 3, 16, 1…
$ periodicos_B4 <int> 0, 4, 0, 3, 3, 0, 1, …
$ periodicos_B5 <int> 10, 16, 8, 4, 12, 4, …
$ periodicos_C <int> 9, 34, 12, 5, 2, 3, 1…
$ periodicos_NA <int> 7, 15, 8, 11, 12, 6, …
$ per_comaluno_A1 <int> 4, 1, 0, 0, 1, 7, 5, …
$ per_comaluno_A2 <int> 5, 5, 5, 0, 2, 15, 3,…
$ per_comaluno_B1 <int> 4, 2, 5, 2, 2, 14, 6,…
$ per_comaluno_B2 <int> 0, 1, 1, 0, 0, 0, 1, …
$ per_comaluno_B3 <int> 2, 2, 0, 1, 0, 7, 9, …
$ per_comaluno_B4 <int> 0, 0, 0, 0, 2, 0, 1, …
$ per_comaluno_B5 <int> 5, 0, 4, 0, 8, 3, 6, …
$ per_comaluno_C <int> 6, 5, 3, 1, 2, 3, 7, …
$ per_comaluno_NA <int> 6, 14, 2, 2, 9, 3, 6,…
Produção e produtividade de artigos
Uma das maneiras de avaliar a produção dos docentes que a CAPES
utiliza é quantificando a produção de artigos pelos docentes. Os artigos
são categorizados em extratos ordenados (A1 é o mais alto), e separados
entre artigos em conferências e periódicos. Usaremos para esse lab a
produção em periódicos avaliados com A1, A2 e B1.
cacc = cacc_tudo %>%
transmute(
docentes = `Docentes.permanentes`,
producao = (periodicos_A1 + periodicos_A2 + periodicos_B1),
produtividade = producao / docentes,
mestrados = Dissertacoes,
doutorados = Teses,
tem_doutorado = tolower(`Tem.doutorado`) == "sim",
mestrados_pprof = mestrados / docentes,
doutorados_pprof = doutorados / docentes
)
cacc_md = cacc %>%
filter(tem_doutorado)
EDA
skimr::skim(cacc)
── Data Summary ────────────────────────
Values
Name cacc
Number of rows 73
Number of columns 8
_______________________
Column type frequency:
logical 1
numeric 7
________________________
Group variables None
cacc %>%
ggplot(aes(x = docentes)) +
geom_histogram(bins = 15, fill = paleta[1])

cacc %>%
ggplot(aes(x = producao)) +
geom_histogram(bins = 15, fill = paleta[2])

cacc %>%
ggplot(aes(x = produtividade)) +
geom_histogram(bins = 15, fill = paleta[3])

Se quisermos modelar o efeito do tamanho do programa em termos de
docentes (permanentes) na quantidade de artigos publicados, podemos usar
regressão.
Importante: sempre queremos ver os dados antes de fazermos
qualquer modelo ou sumário:
cacc %>%
ggplot(aes(x = docentes, y = producao)) +
geom_point()

Parece que existe uma relação. Vamos criar um modelo então:
modelo1 = lm(producao ~ docentes, data = cacc)
tidy(modelo1, conf.int = TRUE, conf.level = 0.95)
glance(modelo1)
Para visualizar o modelo:
cacc_augmented = cacc %>%
add_predictions(modelo1)
cacc_augmented %>%
ggplot(aes(x = docentes)) +
geom_line(aes(y = pred), colour = "brown") +
geom_point(aes(y = producao)) +
labs(y = "Produção do programa")

Se considerarmos que temos apenas uma amostra de todos os programas
de pós em CC no Brasil, o que podemos inferir a partir desse modelo
sobre a relação entre número de docentes permanentes e produção de
artigos em programas de pós?
Normalmente reportaríamos o resultado da seguinte maneira,
substituindo VarIndepX e todos os x’s e y’s pelos nomes e valores de
fato:
Regressão múltipla foi utilizada para analisar se VarIndep1 e
VarIndep2 tem uma associação significativa com VarDep. Os resultados da
regressão indicam que um modelo com os 2 preditores no formato VarDep =
XXX.VarIndep1 + YYY.VarIndep2 explicam XX,XX% da variância da variável
de resposta (R2 = XX,XX). VarIndep1, medida como/em [unidade ou o que é
o 0 e o que é 1] tem uma relação significativa com o erro (b = [yy,yy;
zz,zz], IC com 95%), assim como VarIndep2 medida como [unidade ou o que
é o 0 e o que é 1] (b = [yy,yy; zz,zz], IC com 95%). O aumento de 1
unidade de VarIndep1 produz uma mudança de xxx em VarDep, enquanto um
aumento…
Produza aqui a sua versão desse texto, portanto:
A regressão linear simples foi utilizada para analisar se o número de
docentes permanentes tem uma associação com a produção de artigos. Os
resultados indicam que um modelo com um preditor no formato produção =
-41.27309 + 4.81337 * docentes explica 81,4% da variância da variável de
resposta (R² = 0.8145886). O número de docentes permanentes tem uma
relação significativa com a produção de artigos (b = [4.269955,
5.356786], IC com 95%). O aumento de 1 unidade no número de docentes
permanentes produz uma mudança de aproximadamente 4.8134 na produção de
artigos, o que sugere que programas com mais docentes permanentes tendem
a produzir mais artigos.
Em suma, os resultados indicam que há uma forte relação entre o
número de docentes permanentes e a produção de artigos em programas de
pós-graduação em ciência da computação no Brasil, na qual programas com
mais docentes permanentes costumam produzir mais artigos.
Dito isso, o que significa a relação que você encontrou na prática
para entendermos os programas de pós graduação no Brasil? E algum
palpite de por que a relação que encontramos é forte?
A forte relação positiva encontrada entre o número de docentes
permanentes e a produção de artigos sugere que investir em um corpo
docente qualificado e de tamanho adequado é essencial para a produção
acadêmica.
Mais fatores
modelo2 = lm(producao ~ docentes + mestrados_pprof + doutorados_pprof + tem_doutorado,
data = cacc_md)
tidy(modelo2, conf.int = TRUE, conf.level = 0.95)
glance(modelo2)
E se considerarmos também o número de alunos?
modelo2 = lm(producao ~ docentes + mestrados + doutorados, data = cacc)
tidy(modelo2, conf.int = TRUE, conf.level = 0.95)
glance(modelo2)
Visualizar o modelo com muitas variáveis independentes fica mais
difícil
para_plotar_modelo = cacc %>%
data_grid(producao = seq_range(producao, 10), # Crie um vetor de 10 valores no range
docentes = seq_range(docentes, 4),
# mestrados = seq_range(mestrados, 3),
mestrados = median(mestrados),
doutorados = seq_range(doutorados, 3)) %>%
add_predictions(modelo2)
glimpse(para_plotar_modelo)
Rows: 120
Columns: 5
$ producao <dbl> 0.00000, 0.00000, 0.00000, 0.00000, 0…
$ docentes <dbl> 8.25000, 8.25000, 8.25000, 27.91667, …
$ mestrados <int> 58, 58, 58, 58, 58, 58, 58, 58, 58, 5…
$ doutorados <dbl> 0, 76, 152, 0, 76, 152, 0, 76, 152, 0…
$ pred <dbl> 3.199123, 79.257725, 155.316327, 72.0…
para_plotar_modelo %>%
ggplot(aes(x = docentes, y = pred)) +
geom_line(aes(group = doutorados, colour = doutorados)) +
geom_point(data = cacc, aes(y = producao, colour = doutorados))

Considerando agora esses três fatores, o que podemos dizer sobre como
cada um deles se relaciona com a produção de um programa de pós em CC? E
sobre o modelo? Ele explica mais que o modelo 1?
A regressão linear múltipla foi empregada para investigar a relação
entre docentes permanentes, proporção de mestrados, proporção de
doutorados e a produção de artigos em programas de pós-graduação em
ciência da computação no Brasil. O modelo produção = -14.36631 + 3.49971
* docentes - 0.19495 * mestrados + 1.00077 * doutorados explica 87.06%
da variância da produção de artigos (R² = 0.8706). Os resultados revelam
que docentes (b = [2.5827, 4.4167], IC com 95%, p < 0.001) e
doutorados (b = [0.6355, 1.3660], IC com 95%, p < 0.001) têm
associações significativas e positivas com a produção de artigos,
enquanto mestrados apresentam uma associação negativa (b = [-0.3577,
-0.0322], IC com 95%, p = 0.020). Isso sugere que um aumento no número
de docentes e na proporção de doutorados está associado a uma maior
produção acadêmica, enquanto uma maior proporção de mestrados pode
influenciar negativamente a produção de artigos.
O modelo ajustado (R² = 0.8706) explica mais da variância na produção
de artigos em comparação com o modelo anterior (R² = 0.8145), indicando
uma melhor capacidade de previsão com base nos fatores considerados.
Agora produtividade
Diferente de medirmos produção (total produzido), é medirmos
produtividade (produzido / utilizado). Abaixo focaremos nessa análise.
Para isso crie um modelo que investiga como um conjunto de fatores que
você julga que são relevantes se relacionam com a produtividade dos
programas. Crie um modelo que avalie como pelo menos 3 fatores
se relacionam com a produtividade de um programa. Pode reutilizar
fatores que já definimos e analizamos para produção. Mas cuidado para
não incluir fatores que sejam função linear de outros já incluídos (ex:
incluir A, B e um tercero C=A+B)
Produza abaixo o modelo e um texto que comente (i) o modelo, tal como
os que fizemos antes, e (ii) as implicações - o que aprendemos sobre
como funcionam programas de pós no brasil?.
Para garantir que os fatores escolhidos não sofram de
multicolinearidade, calculou-se o VIF (Variance Inflation Factor) para
cada variável independente no modelo. O VIF é uma medida que mede o
quanto a variância de um coeficiente de regressão está inflacionada
devido à multicolinearidade com outras variáveis independentes no
modelo. Se o VIF for maior que 10, considera-se que há
multicolinearidade alta.
model <- lm(produtividade ~ ., data = cacc)
vif_values <- vif(model)
print(vif_values)
docentes producao mestrados
14.420573 9.099823 14.272466
doutorados tem_doutorado mestrados_pprof
18.021248 2.147811 4.098670
doutorados_pprof
8.372931
Vamos manter no modelo apenas as variáveis com VIF abaixo de 10.
new_model <- lm(produtividade ~ tem_doutorado + mestrados_pprof + doutorados_pprof + producao, data = cacc)
new_vif_values <- vif(new_model)
print(new_vif_values)
A redução dos valores de VIF após ajustar o modelo indica que a
multicolinearidade foi reduzida.
summary(new_model)
Call:
lm(formula = produtividade ~ tem_doutorado + mestrados_pprof +
doutorados_pprof + producao, data = cacc)
Residuals:
Min 1Q Median 3Q Max
-1.3435 -0.5552 -0.0296 0.5887 2.4509
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.150847 0.237499 4.846 7.64e-06
tem_doutoradoTRUE 0.827323 0.247867 3.338 0.00137
mestrados_pprof 0.022634 0.052419 0.432 0.66726
doutorados_pprof -0.027724 0.211708 -0.131 0.89620
producao 0.013050 0.002225 5.864 1.47e-07
(Intercept) ***
tem_doutoradoTRUE **
mestrados_pprof
doutorados_pprof
producao ***
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.8028 on 68 degrees of freedom
Multiple R-squared: 0.6768, Adjusted R-squared: 0.6578
F-statistic: 35.6 on 4 and 68 DF, p-value: 5.028e-16
O modelo ajustado é dado por:
produtividade= 1.150847
+0.827323×tem_doutoradoTRUE+0.022634×mestrados_pprof−0.027724×doutorados_pprof+0.013050×producao
Com um R² = 0.6768, indicando que cerca de 67.68% da variabilidade na
produtividade é explicada pelas variáveis independentes escolhidas.
tem_doutorado (0.827323, p = 0.00137): Programas que possuem
doutorado têm, em média, 0.827323 unidades a mais em produtividade do
que programas que não possuem doutorado.
mestrados_pprof (0.022634, p=0.66726) : Este coeficiente indica
uma associação positiva entre a proporção de mestrados profissionais e a
produtividade. No entanto, o p-valor é maior que o nível de
significância, o que significa que não é estatisticamente
significativo.
doutorados_pprof (-0.027724, p=0.89620): Indica uma fraca
associação negativa entre a proporção de doutorados profissionais e a
produtividade, porém aqui novamente o p-valor é alto, indicando falta de
significância estatística.
producao (0.013050, p < 0.001)): O aumento de uma unidade na
produção está associado a um aumento de 0.013050 unidades na
produtividade. É altamente significativo, sugerindo uma forte associação
positiva entre produção e produtividade.
Esses resultados revelam que a presença de docentes com doutorado e o
nível de produção acadêmica são fatores cruciais para a produtividade
dos programas de pós-graduação em computação no Brasil.
LS0tCnRpdGxlOiAiUmVncmVzc8OjbyBsaW5lYXIgbmEgcHLDoXRpY2EiCm5hbWU6ICJEYW5pZWxsYSBMaW1hIGRlIENhcnZhbGhvIC0gMDEyNDAxNTgwMS0xRCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkobW9kZWxyKQpsaWJyYXJ5KGNhcikKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCgprbml0cjo6b3B0c19jaHVuayRzZXQodGlkeSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gNiwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQgPSA1KQoKcGFsZXRhID0gYygiIzQwNEU0RCIsCiAgICAgICAgICAgIiM5MkRDRTUiLAogICAgICAgICAgICIjOTM4QkExIiwKICAgICAgICAgICAiIzJEMzE0MiIsCiAgICAgICAgICAgIiNGNDc0M0IiKQpgYGAKCiMjIERhZG9zIGRhIENBUEVTIHNvYnJlIGF2YWxpYcOnw6NvIGRhIHDDs3MtZ3JhZHVhw6fDo28KCkEgQ0FQRVMgw6kgdW0gw7NyZ8OjbyBkbyBNRUMgcXVlIHRlbSBhIGF0cmlidWnDp8OjbyBkZSBhY29tcGFuaGFyIGEgcMOzcy1ncmFkdWHDp8OjbyBuYSB1bml2ZXJzaWRhZGUgYnJhc2lsZWlyYS4gVW1hIGRhcyBmb3JtYXMgcXVlIGVsYSBlbmNvbnRyb3UgZGUgZmF6ZXIgaXNzbyBlIHBlbGEgcXVhbCBlbGEgw6kgYmFzdGFudGUgY3JpdGljYWRhIMOpIGF0cmF2w6lzIGRlIHVtYSBhdmFsaWHDp8OjbyBxdWFudGl0YXRpdmEgYSBjYWRhIHggYW5vcyAoZXJhIDMsIG11ZG91IHBhcmEgNCkuIAoKVXNhcmVtb3MgZGFkb3MgZGEgcGVuw7psdGltYSBhdmFsaWHDp8OjbyBkYSBDQVBFUzogCgpgYGB7cn0KY2FjY190dWRvID0gcmVhZC5jc3YoJ2NhY2MuY3N2JykKCmdsaW1wc2UoY2FjY190dWRvKQpgYGAKCiMjIyBQcm9kdcOnw6NvIGUgcHJvZHV0aXZpZGFkZSBkZSBhcnRpZ29zCgpVbWEgZGFzIG1hbmVpcmFzIGRlIGF2YWxpYXIgYSBwcm9kdcOnw6NvIGRvcyBkb2NlbnRlcyBxdWUgYSBDQVBFUyB1dGlsaXphIMOpIHF1YW50aWZpY2FuZG8gYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgcGVsb3MgZG9jZW50ZXMuIE9zIGFydGlnb3Mgc8OjbyBjYXRlZ29yaXphZG9zIGVtIGV4dHJhdG9zIG9yZGVuYWRvcyAoQTEgw6kgbyBtYWlzIGFsdG8pLCBlIHNlcGFyYWRvcyBlbnRyZSBhcnRpZ29zIGVtIGNvbmZlcsOqbmNpYXMgZSBwZXJpw7NkaWNvcy4gVXNhcmVtb3MgcGFyYSBlc3NlIGxhYiBhIHByb2R1w6fDo28gZW0gcGVyacOzZGljb3MgYXZhbGlhZG9zIGNvbSBBMSwgQTIgZSBCMS4gCgpgYGB7cn0KY2FjYyA9IGNhY2NfdHVkbyAlPiUKICB0cmFuc211dGUoCiAgICBkb2NlbnRlcyA9IGBEb2NlbnRlcy5wZXJtYW5lbnRlc2AsCiAgICBwcm9kdWNhbyA9IChwZXJpb2RpY29zX0ExICsgcGVyaW9kaWNvc19BMiArIHBlcmlvZGljb3NfQjEpLAogICAgcHJvZHV0aXZpZGFkZSA9IHByb2R1Y2FvIC8gZG9jZW50ZXMsCiAgICBtZXN0cmFkb3MgPSBEaXNzZXJ0YWNvZXMsCiAgICBkb3V0b3JhZG9zID0gVGVzZXMsCiAgICB0ZW1fZG91dG9yYWRvID0gdG9sb3dlcihgVGVtLmRvdXRvcmFkb2ApID09ICJzaW0iLAogICAgbWVzdHJhZG9zX3Bwcm9mID0gbWVzdHJhZG9zIC8gZG9jZW50ZXMsCiAgICBkb3V0b3JhZG9zX3Bwcm9mID0gZG91dG9yYWRvcyAvIGRvY2VudGVzCiAgKQoKY2FjY19tZCA9IGNhY2MgJT4lIAogIGZpbHRlcih0ZW1fZG91dG9yYWRvKQpgYGAKCgojIyMgRURBCgpgYGB7cn0Kc2tpbXI6OnNraW0oY2FjYykKYGBgCgoKYGBge3J9CmNhY2MgJT4lIAogIGdncGxvdChhZXMoeCA9IGRvY2VudGVzKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTUsIGZpbGwgPSBwYWxldGFbMV0pCgpjYWNjICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwcm9kdWNhbykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1LCBmaWxsID0gcGFsZXRhWzJdKQoKY2FjYyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcHJvZHV0aXZpZGFkZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1LCBmaWxsID0gcGFsZXRhWzNdKQpgYGAKClNlIHF1aXNlcm1vcyBtb2RlbGFyIG8gZWZlaXRvIGRvIHRhbWFuaG8gZG8gcHJvZ3JhbWEgZW0gdGVybW9zIGRlIGRvY2VudGVzIChwZXJtYW5lbnRlcykgbmEgcXVhbnRpZGFkZSBkZSBhcnRpZ29zIHB1YmxpY2Fkb3MsIHBvZGVtb3MgdXNhciByZWdyZXNzw6NvLiAKCipJbXBvcnRhbnRlKjogc2VtcHJlIHF1ZXJlbW9zIHZlciBvcyBkYWRvcyBhbnRlcyBkZSBmYXplcm1vcyBxdWFscXVlciBtb2RlbG8gb3Ugc3Vtw6FyaW86IAoKYGBge3J9CmNhY2MgJT4lIAogIGdncGxvdChhZXMoeCA9IGRvY2VudGVzLCB5ID0gcHJvZHVjYW8pKSArIAogIGdlb21fcG9pbnQoKQpgYGAKClBhcmVjZSBxdWUgZXhpc3RlIHVtYSByZWxhw6fDo28uIFZhbW9zIGNyaWFyIHVtIG1vZGVsbyBlbnTDo286CgpgYGB7cn0KbW9kZWxvMSA9IGxtKHByb2R1Y2FvIH4gZG9jZW50ZXMsIGRhdGEgPSBjYWNjKQoKdGlkeShtb2RlbG8xLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQpnbGFuY2UobW9kZWxvMSkKYGBgCgpQYXJhIHZpc3VhbGl6YXIgbyBtb2RlbG86CgpgYGB7cn0KY2FjY19hdWdtZW50ZWQgPSBjYWNjICU+JSAKICBhZGRfcHJlZGljdGlvbnMobW9kZWxvMSkgCgpjYWNjX2F1Z21lbnRlZCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZG9jZW50ZXMpKSArIAogIGdlb21fbGluZShhZXMoeSA9IHByZWQpLCBjb2xvdXIgPSAiYnJvd24iKSArIAogIGdlb21fcG9pbnQoYWVzKHkgPSBwcm9kdWNhbykpICsgCiAgbGFicyh5ID0gIlByb2R1w6fDo28gZG8gcHJvZ3JhbWEiKQpgYGAKClNlIGNvbnNpZGVyYXJtb3MgcXVlIHRlbW9zIGFwZW5hcyB1bWEgYW1vc3RyYSBkZSB0b2RvcyBvcyBwcm9ncmFtYXMgZGUgcMOzcyBlbSBDQyBubyBCcmFzaWwsIG8gcXVlIHBvZGVtb3MgaW5mZXJpciBhIHBhcnRpciBkZXNzZSBtb2RlbG8gc29icmUgYSByZWxhw6fDo28gZW50cmUgbsO6bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcyBlIHByb2R1w6fDo28gZGUgYXJ0aWdvcyBlbSBwcm9ncmFtYXMgZGUgcMOzcz8gCgpOb3JtYWxtZW50ZSByZXBvcnRhcsOtYW1vcyBvIHJlc3VsdGFkbyBkYSBzZWd1aW50ZSBtYW5laXJhLCBzdWJzdGl0dWluZG8gVmFySW5kZXBYIGUgdG9kb3Mgb3MgeCdzIGUgeSdzIHBlbG9zIG5vbWVzIGUgdmFsb3JlcyBkZSBmYXRvOgoKPiBSZWdyZXNzw6NvIG3Dumx0aXBsYSBmb2kgdXRpbGl6YWRhIHBhcmEgYW5hbGlzYXIgc2UgVmFySW5kZXAxIGUgVmFySW5kZXAyIHRlbSB1bWEgYXNzb2NpYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIFZhckRlcC4gT3MgcmVzdWx0YWRvcyBkYSByZWdyZXNzw6NvIGluZGljYW0gcXVlIHVtIG1vZGVsbyBjb20gb3MgMiBwcmVkaXRvcmVzIG5vIGZvcm1hdG8gVmFyRGVwID0gWFhYLlZhckluZGVwMSArIFlZWS5WYXJJbmRlcDIgZXhwbGljYW0gWFgsWFglIGRhIHZhcmnDom5jaWEgZGEgdmFyacOhdmVsIGRlIHJlc3Bvc3RhIChSMiA9IFhYLFhYKS4gVmFySW5kZXAxLCBtZWRpZGEgY29tby9lbSBbdW5pZGFkZSBvdSBvIHF1ZSDDqSBvIDAgZSBvIHF1ZSDDqSAxXSB0ZW0gdW1hIHJlbGHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSBvIGVycm8gKGIgPSBbeXkseXk7IHp6LHp6XSwgSUMgY29tIDk1JSksIGFzc2ltIGNvbW8gVmFySW5kZXAyIG1lZGlkYSBjb21vIFt1bmlkYWRlIG91IG8gcXVlIMOpIG8gMCBlIG8gcXVlIMOpIDFdIChiID0gW3l5LHl5OyB6eix6el0sIElDIGNvbSA5NSUpLiBPIGF1bWVudG8gZGUgMSB1bmlkYWRlIGRlIFZhckluZGVwMSBwcm9kdXogdW1hIG11ZGFuw6dhIGRlIHh4eCBlbSBWYXJEZXAsIGVucXVhbnRvIHVtIGF1bWVudG8uLi4KClByb2R1emEgYXF1aSBhIHN1YSB2ZXJzw6NvIGRlc3NlIHRleHRvLCBwb3J0YW50bzoKCi0tLS0tCgpBIHJlZ3Jlc3PDo28gbGluZWFyIHNpbXBsZXMgZm9pIHV0aWxpemFkYSBwYXJhIGFuYWxpc2FyIHNlIG8gbsO6bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcyB0ZW0gdW1hIGFzc29jaWHDp8OjbyBjb20gYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MuIE9zIHJlc3VsdGFkb3MgaW5kaWNhbSBxdWUgdW0gbW9kZWxvIGNvbSB1bSBwcmVkaXRvciBubyBmb3JtYXRvIHByb2R1w6fDo28gPSAtNDEuMjczMDkgKyA0LjgxMzM3ICogZG9jZW50ZXMgZXhwbGljYSA4MSw0JSBkYSB2YXJpw6JuY2lhIGRhIHZhcmnDoXZlbCBkZSByZXNwb3N0YSAoUsKyID0gMC44MTQ1ODg2KS4gTyBuw7ptZXJvIGRlIGRvY2VudGVzIHBlcm1hbmVudGVzIHRlbSB1bWEgcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIGEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zIChiID0gIFs0LjI2OTk1NSwgNS4zNTY3ODZdLCBJQyBjb20gOTUlKS4gTyBhdW1lbnRvIGRlIDEgdW5pZGFkZSBubyBuw7ptZXJvIGRlIGRvY2VudGVzIHBlcm1hbmVudGVzIHByb2R1eiB1bWEgbXVkYW7Dp2EgZGUgYXByb3hpbWFkYW1lbnRlIDQuODEzNCBuYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MsIG8gcXVlIHN1Z2VyZSBxdWUgcHJvZ3JhbWFzIGNvbSBtYWlzIGRvY2VudGVzIHBlcm1hbmVudGVzIHRlbmRlbSBhIHByb2R1emlyIG1haXMgYXJ0aWdvcy4KCkVtIHN1bWEsIG9zIHJlc3VsdGFkb3MgaW5kaWNhbSBxdWUgaMOhIHVtYSBmb3J0ZSByZWxhw6fDo28gZW50cmUgbyBuw7ptZXJvIGRlIGRvY2VudGVzIHBlcm1hbmVudGVzIGUgYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgZW0gcHJvZ3JhbWFzIGRlIHDDs3MtZ3JhZHVhw6fDo28gZW0gY2nDqm5jaWEgZGEgY29tcHV0YcOnw6NvIG5vIEJyYXNpbCwgbmEgcXVhbCBwcm9ncmFtYXMgY29tIG1haXMgZG9jZW50ZXMgcGVybWFuZW50ZXMgY29zdHVtYW0gcHJvZHV6aXIgbWFpcyBhcnRpZ29zLgoKLS0tLS0KCkRpdG8gaXNzbywgbyBxdWUgc2lnbmlmaWNhIGEgcmVsYcOnw6NvIHF1ZSB2b2PDqiBlbmNvbnRyb3UgbmEgcHLDoXRpY2EgcGFyYSBlbnRlbmRlcm1vcyBvcyBwcm9ncmFtYXMgZGUgcMOzcyBncmFkdWHDp8OjbyBubyBCcmFzaWw/IEUgYWxndW0gcGFscGl0ZSBkZSBwb3IgcXVlIGEgcmVsYcOnw6NvIHF1ZSBlbmNvbnRyYW1vcyDDqSBmb3J0ZT8KCi0tLS0tCgpBIGZvcnRlIHJlbGHDp8OjbyBwb3NpdGl2YSBlbmNvbnRyYWRhIGVudHJlIG8gbsO6bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcyBlIGEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zIHN1Z2VyZSBxdWUgaW52ZXN0aXIgZW0gdW0gY29ycG8gZG9jZW50ZSBxdWFsaWZpY2FkbyBlIGRlIHRhbWFuaG8gYWRlcXVhZG8gw6kgZXNzZW5jaWFsIHBhcmEgYSBwcm9kdcOnw6NvIGFjYWTDqm1pY2EuCgotLS0tLQoKIyMgTWFpcyBmYXRvcmVzCgpgYGB7cn0KbW9kZWxvMiA9IGxtKHByb2R1Y2FvIH4gZG9jZW50ZXMgKyBtZXN0cmFkb3NfcHByb2YgKyBkb3V0b3JhZG9zX3Bwcm9mICsgdGVtX2RvdXRvcmFkbywgCiAgICAgICAgICAgICBkYXRhID0gY2FjY19tZCkKCnRpZHkobW9kZWxvMiwgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45NSkKZ2xhbmNlKG1vZGVsbzIpCmBgYAoKRSBzZSBjb25zaWRlcmFybW9zIHRhbWLDqW0gbyBuw7ptZXJvIGRlIGFsdW5vcz8KCmBgYHtyfQptb2RlbG8yID0gbG0ocHJvZHVjYW8gfiBkb2NlbnRlcyArIG1lc3RyYWRvcyArIGRvdXRvcmFkb3MsIGRhdGEgPSBjYWNjKQoKdGlkeShtb2RlbG8yLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQpnbGFuY2UobW9kZWxvMikKYGBgCgpWaXN1YWxpemFyIG8gbW9kZWxvIGNvbSBtdWl0YXMgdmFyacOhdmVpcyBpbmRlcGVuZGVudGVzIGZpY2EgbWFpcyBkaWbDrWNpbAoKYGBge3J9CnBhcmFfcGxvdGFyX21vZGVsbyA9IGNhY2MgJT4lIAogIGRhdGFfZ3JpZChwcm9kdWNhbyA9IHNlcV9yYW5nZShwcm9kdWNhbywgMTApLCAjIENyaWUgdW0gdmV0b3IgZGUgMTAgdmFsb3JlcyBubyByYW5nZQogICAgICAgICAgICBkb2NlbnRlcyA9IHNlcV9yYW5nZShkb2NlbnRlcywgNCksICAKICAgICAgICAgICAgIyBtZXN0cmFkb3MgPSBzZXFfcmFuZ2UobWVzdHJhZG9zLCAzKSwKICAgICAgICAgICAgbWVzdHJhZG9zID0gbWVkaWFuKG1lc3RyYWRvcyksCiAgICAgICAgICAgIGRvdXRvcmFkb3MgPSBzZXFfcmFuZ2UoZG91dG9yYWRvcywgMykpICU+JSAKICBhZGRfcHJlZGljdGlvbnMobW9kZWxvMikKCmdsaW1wc2UocGFyYV9wbG90YXJfbW9kZWxvKQoKYGBgCgpgYGB7cn0KcGFyYV9wbG90YXJfbW9kZWxvICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBkb2NlbnRlcywgeSA9IHByZWQpKSArIAogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBkb3V0b3JhZG9zLCBjb2xvdXIgPSBkb3V0b3JhZG9zKSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBjYWNjLCBhZXMoeSA9IHByb2R1Y2FvLCBjb2xvdXIgPSBkb3V0b3JhZG9zKSkKYGBgCgpDb25zaWRlcmFuZG8gYWdvcmEgZXNzZXMgdHLDqnMgZmF0b3JlcywgbyBxdWUgcG9kZW1vcyBkaXplciBzb2JyZSBjb21vIGNhZGEgdW0gZGVsZXMgc2UgcmVsYWNpb25hIGNvbSBhIHByb2R1w6fDo28gZGUgdW0gcHJvZ3JhbWEgZGUgcMOzcyBlbSBDQz8gRSBzb2JyZSBvIG1vZGVsbz8gRWxlIGV4cGxpY2EgbWFpcyBxdWUgbyBtb2RlbG8gMT8gCgotLS0tLQoKQSByZWdyZXNzw6NvIGxpbmVhciBtw7psdGlwbGEgZm9pIGVtcHJlZ2FkYSBwYXJhIGludmVzdGlnYXIgYSByZWxhw6fDo28gZW50cmUgZG9jZW50ZXMgcGVybWFuZW50ZXMsIHByb3BvcsOnw6NvIGRlIG1lc3RyYWRvcywgcHJvcG9yw6fDo28gZGUgZG91dG9yYWRvcyBlIGEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zIGVtIHByb2dyYW1hcyBkZSBww7NzLWdyYWR1YcOnw6NvIGVtIGNpw6puY2lhIGRhIGNvbXB1dGHDp8OjbyBubyBCcmFzaWwuIE8gbW9kZWxvIHByb2R1w6fDo28gPSAtMTQuMzY2MzEgKyAzLjQ5OTcxICogZG9jZW50ZXMgLSAwLjE5NDk1ICogbWVzdHJhZG9zICsgMS4wMDA3NyAqIGRvdXRvcmFkb3MgZXhwbGljYSA4Ny4wNiUgZGEgdmFyacOibmNpYSBkYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgKFLCsiA9IDAuODcwNikuIE9zIHJlc3VsdGFkb3MgcmV2ZWxhbSBxdWUgZG9jZW50ZXMgKGIgPSBbMi41ODI3LCA0LjQxNjddLCBJQyBjb20gOTUlLCBwIDwgMC4wMDEpIGUgZG91dG9yYWRvcyAoYiA9IFswLjYzNTUsIDEuMzY2MF0sIElDIGNvbSA5NSUsIHAgPCAwLjAwMSkgdMOqbSBhc3NvY2lhw6fDtWVzIHNpZ25pZmljYXRpdmFzIGUgcG9zaXRpdmFzIGNvbSBhIHByb2R1w6fDo28gZGUgYXJ0aWdvcywgZW5xdWFudG8gbWVzdHJhZG9zIGFwcmVzZW50YW0gdW1hIGFzc29jaWHDp8OjbyBuZWdhdGl2YSAoYiA9IFstMC4zNTc3LCAtMC4wMzIyXSwgSUMgY29tIDk1JSwgcCA9IDAuMDIwKS4gSXNzbyBzdWdlcmUgcXVlIHVtIGF1bWVudG8gbm8gbsO6bWVybyBkZSBkb2NlbnRlcyBlIG5hIHByb3BvcsOnw6NvIGRlIGRvdXRvcmFkb3MgZXN0w6EgYXNzb2NpYWRvIGEgdW1hIG1haW9yIHByb2R1w6fDo28gYWNhZMOqbWljYSwgZW5xdWFudG8gdW1hIG1haW9yIHByb3BvcsOnw6NvIGRlIG1lc3RyYWRvcyBwb2RlIGluZmx1ZW5jaWFyIG5lZ2F0aXZhbWVudGUgYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MuCgpPIG1vZGVsbyBhanVzdGFkbyAoUsKyID0gMC44NzA2KSBleHBsaWNhIG1haXMgZGEgdmFyacOibmNpYSBuYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgZW0gY29tcGFyYcOnw6NvIGNvbSBvIG1vZGVsbyBhbnRlcmlvciAoUsKyID0gMC44MTQ1KSwgaW5kaWNhbmRvIHVtYSBtZWxob3IgY2FwYWNpZGFkZSBkZSBwcmV2aXPDo28gY29tIGJhc2Ugbm9zIGZhdG9yZXMgY29uc2lkZXJhZG9zLgoKLS0tLS0KCgojIyBBZ29yYSBwcm9kdXRpdmlkYWRlIAoKRGlmZXJlbnRlIGRlIG1lZGlybW9zIHByb2R1w6fDo28gKHRvdGFsIHByb2R1emlkbyksIMOpIG1lZGlybW9zIHByb2R1dGl2aWRhZGUgKHByb2R1emlkbyAvIHV0aWxpemFkbykuIEFiYWl4byBmb2NhcmVtb3MgbmVzc2EgYW7DoWxpc2UuIFBhcmEgaXNzbyBjcmllIHVtIG1vZGVsbyBxdWUgaW52ZXN0aWdhIGNvbW8gdW0gY29uanVudG8gZGUgZmF0b3JlcyBxdWUgdm9jw6oganVsZ2EgcXVlIHPDo28gcmVsZXZhbnRlcyBzZSByZWxhY2lvbmFtIGNvbSBhIHByb2R1dGl2aWRhZGUgZG9zIHByb2dyYW1hcy4gQ3JpZSB1bSBtb2RlbG8gcXVlIGF2YWxpZSBjb21vIF9wZWxvIG1lbm9zIDMgZmF0b3Jlc18gc2UgcmVsYWNpb25hbSBjb20gYSBwcm9kdXRpdmlkYWRlIGRlIHVtIHByb2dyYW1hLiBQb2RlIHJldXRpbGl6YXIgZmF0b3JlcyBxdWUgasOhIGRlZmluaW1vcyBlIGFuYWxpemFtb3MgcGFyYSBwcm9kdcOnw6NvLiBNYXMgY3VpZGFkbyBwYXJhIG7Do28gaW5jbHVpciBmYXRvcmVzIHF1ZSBzZWphbSBmdW7Dp8OjbyBsaW5lYXIgZGUgb3V0cm9zIGrDoSBpbmNsdcOtZG9zIChleDogaW5jbHVpciBBLCBCIGUgdW0gdGVyY2VybyBDPUErQikKClByb2R1emEgYWJhaXhvIG8gbW9kZWxvIGUgdW0gdGV4dG8gcXVlIGNvbWVudGUgKGkpIG8gbW9kZWxvLCB0YWwgY29tbyBvcyBxdWUgZml6ZW1vcyBhbnRlcywgZSAoaWkpIGFzIGltcGxpY2HDp8O1ZXMgLSBvIHF1ZSBhcHJlbmRlbW9zIHNvYnJlIGNvbW8gZnVuY2lvbmFtIHByb2dyYW1hcyBkZSBww7NzIG5vIGJyYXNpbD8uCgpQYXJhIGdhcmFudGlyIHF1ZSBvcyBmYXRvcmVzIGVzY29saGlkb3MgbsOjbyBzb2ZyYW0gZGUgbXVsdGljb2xpbmVhcmlkYWRlLCBjYWxjdWxvdS1zZSBvIFZJRiAoVmFyaWFuY2UgSW5mbGF0aW9uIEZhY3RvcikgcGFyYSBjYWRhIHZhcmnDoXZlbCBpbmRlcGVuZGVudGUgbm8gbW9kZWxvLiBPIFZJRiDDqSB1bWEgbWVkaWRhIHF1ZSBtZWRlIG8gcXVhbnRvIGEgdmFyacOibmNpYSBkZSB1bSBjb2VmaWNpZW50ZSBkZSByZWdyZXNzw6NvIGVzdMOhIGluZmxhY2lvbmFkYSBkZXZpZG8gw6AgbXVsdGljb2xpbmVhcmlkYWRlIGNvbSBvdXRyYXMgdmFyacOhdmVpcyBpbmRlcGVuZGVudGVzIG5vIG1vZGVsby4gU2UgbyBWSUYgZm9yIG1haW9yIHF1ZSAxMCwgY29uc2lkZXJhLXNlIHF1ZSBow6EgbXVsdGljb2xpbmVhcmlkYWRlIGFsdGEuCgpgYGB7cn0KbW9kZWwgPC0gbG0ocHJvZHV0aXZpZGFkZSB+IC4sIGRhdGEgPSBjYWNjKQoKdmlmX3ZhbHVlcyA8LSB2aWYobW9kZWwpCnByaW50KHZpZl92YWx1ZXMpCmBgYAoKVmFtb3MgbWFudGVyIG5vIG1vZGVsbyBhcGVuYXMgYXMgdmFyacOhdmVpcyBjb20gVklGIGFiYWl4byBkZSAxMC4KCmBgYHtyfQpuZXdfbW9kZWwgPC0gbG0ocHJvZHV0aXZpZGFkZSB+IHRlbV9kb3V0b3JhZG8gKyBtZXN0cmFkb3NfcHByb2YgKyBkb3V0b3JhZG9zX3Bwcm9mICsgcHJvZHVjYW8sIGRhdGEgPSBjYWNjKQoKbmV3X3ZpZl92YWx1ZXMgPC0gdmlmKG5ld19tb2RlbCkKcHJpbnQobmV3X3ZpZl92YWx1ZXMpCmBgYAoKQSByZWR1w6fDo28gZG9zIHZhbG9yZXMgZGUgVklGIGFww7NzIGFqdXN0YXIgbyBtb2RlbG8gaW5kaWNhIHF1ZSBhIG11bHRpY29saW5lYXJpZGFkZSBmb2kgcmVkdXppZGEuCgpgYGB7cn0Kc3VtbWFyeShuZXdfbW9kZWwpCmBgYAoKTyBtb2RlbG8gYWp1c3RhZG8gw6kgZGFkbyBwb3I6Cgpwcm9kdXRpdmlkYWRlPSAxLjE1MDg0NyArMC44MjczMjPDl3RlbV9kb3V0b3JhZG9UUlVFKzAuMDIyNjM0w5dtZXN0cmFkb3NfcHByb2biiJIwLjAyNzcyNMOXZG91dG9yYWRvc19wcHJvZiswLjAxMzA1MMOXcHJvZHVjYW8KCkNvbSB1bSBSwrIgPSAwLjY3NjgsIGluZGljYW5kbyBxdWUgY2VyY2EgZGUgNjcuNjglIGRhIHZhcmlhYmlsaWRhZGUgbmEgcHJvZHV0aXZpZGFkZSDDqSBleHBsaWNhZGEgcGVsYXMgdmFyacOhdmVpcyBpbmRlcGVuZGVudGVzIGVzY29saGlkYXMuCgoqIHRlbV9kb3V0b3JhZG8gKDAuODI3MzIzLCBwID0gMC4wMDEzNyk6IFByb2dyYW1hcyBxdWUgcG9zc3VlbSBkb3V0b3JhZG8gdMOqbSwgZW0gbcOpZGlhLCAwLjgyNzMyMyB1bmlkYWRlcyBhIG1haXMgZW0gcHJvZHV0aXZpZGFkZSBkbyBxdWUgcHJvZ3JhbWFzIHF1ZSBuw6NvIHBvc3N1ZW0gZG91dG9yYWRvLiAKCiogbWVzdHJhZG9zX3Bwcm9mICgwLjAyMjYzNCwgcD0wLjY2NzI2KSA6IEVzdGUgY29lZmljaWVudGUgaW5kaWNhIHVtYSBhc3NvY2lhw6fDo28gcG9zaXRpdmEgZW50cmUgYSBwcm9wb3LDp8OjbyBkZSBtZXN0cmFkb3MgcHJvZmlzc2lvbmFpcyBlIGEgcHJvZHV0aXZpZGFkZS4gTm8gZW50YW50bywgbyBwLXZhbG9yIMOpIG1haW9yIHF1ZSBvIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSwgbyBxdWUgc2lnbmlmaWNhIHF1ZSBuw6NvIMOpIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2by4KCiogZG91dG9yYWRvc19wcHJvZiAoLTAuMDI3NzI0LCBwPTAuODk2MjApOiBJbmRpY2EgdW1hIGZyYWNhIGFzc29jaWHDp8OjbyBuZWdhdGl2YSBlbnRyZSBhIHByb3BvcsOnw6NvIGRlIGRvdXRvcmFkb3MgcHJvZmlzc2lvbmFpcyBlIGEgcHJvZHV0aXZpZGFkZSwgcG9yw6ltIGFxdWkgbm92YW1lbnRlIG8gcC12YWxvciDDqSBhbHRvLCBpbmRpY2FuZG8gZmFsdGEgZGUgc2lnbmlmaWPDom5jaWEgZXN0YXTDrXN0aWNhLgoKKiBwcm9kdWNhbyAoMC4wMTMwNTAsIHAgPCAwLjAwMSkpOiBPIGF1bWVudG8gZGUgdW1hIHVuaWRhZGUgbmEgcHJvZHXDp8OjbyBlc3TDoSBhc3NvY2lhZG8gYSB1bSBhdW1lbnRvIGRlIDAuMDEzMDUwIHVuaWRhZGVzIG5hIHByb2R1dGl2aWRhZGUuIMOJIGFsdGFtZW50ZSBzaWduaWZpY2F0aXZvLCBzdWdlcmluZG8gdW1hIGZvcnRlIGFzc29jaWHDp8OjbyBwb3NpdGl2YSBlbnRyZSBwcm9kdcOnw6NvIGUgcHJvZHV0aXZpZGFkZS4KCkVzc2VzIHJlc3VsdGFkb3MgcmV2ZWxhbSBxdWUgYSBwcmVzZW7Dp2EgZGUgZG9jZW50ZXMgY29tIGRvdXRvcmFkbyBlIG8gbsOtdmVsIGRlIHByb2R1w6fDo28gYWNhZMOqbWljYSBzw6NvIGZhdG9yZXMgY3J1Y2lhaXMgcGFyYSBhIHByb2R1dGl2aWRhZGUgZG9zIHByb2dyYW1hcyBkZSBww7NzLWdyYWR1YcOnw6NvIGVtIGNvbXB1dGHDp8OjbyBubyBCcmFzaWwu