Resuelva las situaicones que se le presentan a continuación. Para
cada una de las situaciones deberán generar un gráfico en ggplot que
acompañe a la resolución.
Problema 1
En un laboratorio de botánica se sembraron plántulas de frijol
(Phaseolus vulgaris) bajo condiciones controladas: luz
constante, temperatura de 25 °C y riego regular. Cada 2 días se midió la
altura de 10 plántulas y se registró el promedio. Su grupo debe estimar
la tasa de crecimiento de las plántulas con un modelo
lineal. Si ustedes tuvieran a cargo de laboratorio, qué decisiones
tomarían para que el crecimiento sea mayor.
Ahora, con ese modelo, haga una predicción de cuál será el tamañao de
las plantas en los días 40 y 52.
predict(modelol, nuevos_datos)
1 2
45.68988 58.78060
library(readxl)
Problema1 <- read_excel("C:/Users/elean/OneDrive/Escritorio/Modelosb_III/Problemas_Modelos.xlsx",
sheet = "Problema1")
View(Problema1)
Problema1
Problema1 <- data.frame(
Tiempo = c(40, 52),
Altura = problema1
)
class(problema1)
problema1 <- Problema1
promedio <- mean(Problema1$Altura)
grafico1 <- ggplot(Problema1, aes(x = Tiempo, y = Altura)) +
# Línea del promedio (azul cielo claro)
geom_hline(yintercept = promedio, linetype = "dashed",
color = "#7FA3C7", linewidth = 0.7) +
annotate("text", x = max(Problema1$Tiempo), y = promedio,
label = paste0("Promedio = ", round(promedio, 1), " cm"),
hjust = 1, vjust = -0.6, color = "#A9C4E0", size = 4) +
# Recta de tendencia con banda de confianza (amarillo luna)
geom_smooth(method = "lm", color = "#F4D35E", fill = "#E9B44C",
alpha = 0.3, linewidth = 1.2) +
# Puntos rojizos
geom_point(color = "#F28C28", fill = "#FFE066", shape = 21,
size = 4, stroke = 1, alpha = 0.9) +
labs(
x = "Tiempo (días)",
y = "Altura (cm)"
) +
theme_minimal(base_size = 14) +
theme(
# Fondo azul noche
plot.background = element_rect(fill = "#0B1F4B", color = NA),
panel.background = element_rect(fill = "#10285E", color = NA),
# Textos claros
plot.title = element_text(face = "bold", color = "#F4D35E"),
plot.subtitle = element_text(color = "#A9C4E0"),
axis.title = element_text(color = "#DCE6F2"),
axis.text = element_text(color = "#A9C4E0"),
# Cuadrícula sutil azulada
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "#1E3A78")
)
grafico1
mod_prob1 <- lm(Altura~ Tiempo, data = Problema1)
summary(mod_prob1)
nuevos_datos <- data.frame(Tiempo= c(40,52))
predict(mod_prob1, nuevos_datos)
Respuesta
1 2 17.32667 17.32667
Problema 2
La lapa roja o guacamaya roja (Ara macao) fue casi eliminada
de buena parte del Pacífico de Costa Rica por la pérdida de bosque y la
captura de polluelos. Gracias a programas de conservación y
reintroducción, algunas poblaciones se han recuperado.
Imaginen que un programa de conservación liberó un grupo pequeño de
lapas rojas en un bosque protegido del Pacífico central y las
censó cada año durante 20 años. Ustedes deben ajustar
un modelo logístico a los datos y estimar los
parámetros que describen el crecimiento de esta población. Como
tomadores de decisión, especifiquen cuándo deberá de terminar el
monitoreo ecológico, según el comportamiento poblacional.
library(growthrates)
datos <- data.frame(
ano = 0:20,
poblacion = c(
12, 15, 24, 29, 43, 50, 69, 79, 101, 109,
131, 136, 152, 154, 166, 165, 174, 171, 179, 174, 181
)
)
==========================================
MODELO LOGÍSTICO
==========================================
modelo <- nls(
poblacion ~ K / (1 + A * exp(-r * ano)),
data = datos,
start = list(K = 190, A = 15, r = 0.3)
)
==========================================
VER LOS RESULTADOS DEL MODELO
==========================================
summary(modelo)
==========================================
OBTENER LOS PARÁMETROS
==========================================
K <- coef(modelo)["K"]
A <- coef(modelo)["A"]
r <- coef(modelo)["r"]
K A r
==========================================
CREAR LA CURVA LOGÍSTICA
==========================================
ano_curva <- seq(0, 20, length.out = 200)
poblacion_curva <- K / (1 + A * exp(-r * ano_curva))
==========================================
GRÁFICA
==========================================
plot(
datos$ano,
datos$poblacion,
pch = 19,
xlab = "Muestreo",
ylab = "Número de individuos",
main = "Crecimiento poblacional de la lapa roja (Ara macao)",
xlim = c(0, 20),
ylim = c(0, K * 1.1)
)
Curva logística
lines(
ano_curva,
poblacion_curva,
lwd = 3
)
Capacidad de carga
abline(
h = K,
lty = 2,
lwd = 2
)
Leyenda
legend(
"bottomright",
legend = c(
"Datos observados",
"Modelo logístico",
"Capacidad de carga (K)"
),
pch = c(19, NA, NA),
lty = c(NA, 1, 2),
lwd = c(NA, 3, 2)
)
Respuesta
Problema 3
En los bosques nubosos de la cordillera de Tilarán, un anfibio
endémico (especie ficticia, inspirada en lo ocurrido con el sapo dorado
de Monteverde) mantenía una población estable de unos 500 individuos. A
partir de cierto momento, la llegada de un hongo patógeno
(quitridiomicosis) y el aumento de la temperatura hicieron que las
muertes superaran a los nacimientos. Un equipo de biólogos censó la
población cada año durante 12 años. (mumax = -0.3, K =
550)
Ustedes deben ajustar un modelo logístico con tasa de
crecimiento y usarlo para predecir cuándo desaparecerá
la población.
## Para predecir:
ajuste <- fit_growthmodel(
FUN = grow_logistic,
p = c(y0 = , mumax = , K = ), # valores iniciales
time = tiempo,
y = individuos,
lower = c(y0 = 1, mumax = -3, K = 1),
upper = c(y0 = 2000, mumax = 0, K = 5000)
)
summary(ajuste)
coef(ajuste)
## Predicción de cuál será el número de individuos en un tiempo determinado
p <- coef(ajuste)
t_pred <- c(20,40,50)
N_pred <- grow_logistic(t_pred, p)[, "y"]
## Predicción de en qué momento la población va a ser 0
t_alcanza <- function(N, p) {
with(as.list(p), log(N * (K - y0) / (y0 * (K - N))) / mumax)
}
t_alcanza(0.1, p) # K/2 y 90 % de K
library(readxl)
Problema3 <- read_excel("C:/Users/elean/OneDrive/Escritorio/Modelosb_III/Problemas_Modelos.xlsx",
sheet = "Problema3")
View(Problema3)
Problema3
ggplot(Problema3, aes(x = Muestreo, y = Individuos)) +
geom_line(color = "#2E8B57", linewidth = 1.2) +
geom_point(color = "#1B4332", fill = "#B7E04A", shape = 21,
size = 3, stroke = 0.8, alpha = 0.95) +
theme_classic() +
labs(x = "Año", y = "Individuos")
Problema3
tiempo <- Problema3$Muestreo
individuos <- Problema3$Individuos
library(growthrates)
library(ggplot2)
# 1. Ajuste del modelo logístico
ajuste <- fit_growthmodel(
FUN = grow_logistic,
p = c(y0 = 500, mumax = -0.3, K = 550), # valores iniciales
time = Problema3$Muestreo,
y = Problema3$Individuos,
lower = c(y0 = 1, mumax = -3, K = 1),
upper = c(y0 = 2000, mumax = 0, K = 5000)
)
summary(ajuste)
p <- coef(ajuste)
p
# 2. Individuos en tiempos futuros
t_pred <- c(20, 40, 50)
N_pred <- grow_logistic(t_pred, p)[, "y"]
N_pred
# 3. Tiempo en que la población llega a un umbral de extinción
t_alcanza <- function(N, p) {
with(as.list(p), log(N * (K - y0) / (y0 * (K - N))) / mumax)
}
t_alcanza(1, p) # queda 1 individuo
t_alcanza(0.1, p) # menos de 1 individuo (extinción práctica)
Respuesta
Según el modelo, en el año 20 quedarían aproximadamente [valor]
individuos, en el año 40 [valor] y en el año 50 [valor].
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdGhlbWU6IHVuaXRlZA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNClJlc3VlbHZhIGxhcyBzaXR1YWljb25lcyBxdWUgc2UgbGUgcHJlc2VudGFuIGEgY29udGludWFjacOzbi4gUGFyYSBjYWRhIHVuYSBkZSBsYXMgc2l0dWFjaW9uZXMgZGViZXLDoW4gZ2VuZXJhciB1biBncsOhZmljbyBlbiBnZ3Bsb3QgcXVlIGFjb21wYcOxZSBhIGxhIHJlc29sdWNpw7NuLg0KDQoNCiMgUHJvYmxlbWEgMQ0KDQpFbiB1biBsYWJvcmF0b3JpbyBkZSBib3TDoW5pY2Egc2Ugc2VtYnJhcm9uIHBsw6FudHVsYXMgZGUgZnJpam9sICgqUGhhc2VvbHVzIHZ1bGdhcmlzKikgYmFqbyBjb25kaWNpb25lcyBjb250cm9sYWRhczogbHV6IGNvbnN0YW50ZSwgdGVtcGVyYXR1cmEgZGUgMjUgwrBDIHkgcmllZ28gcmVndWxhci4gQ2FkYSAyIGTDrWFzIHNlIG1pZGnDsyBsYSBhbHR1cmEgZGUgMTAgcGzDoW50dWxhcyB5IHNlIHJlZ2lzdHLDsyBlbCBwcm9tZWRpby4gU3UgZ3J1cG8gZGViZSBlc3RpbWFyIGxhwqAqKnRhc2EgZGUgY3JlY2ltaWVudG8qKsKgZGUgbGFzIHBsw6FudHVsYXMgY29uIHVuIG1vZGVsbyBsaW5lYWwuIFNpIHVzdGVkZXMgdHV2aWVyYW4gYSBjYXJnbyBkZSBsYWJvcmF0b3JpbywgcXXDqSBkZWNpc2lvbmVzIHRvbWFyw61hbiBwYXJhIHF1ZSBlbCBjcmVjaW1pZW50byBzZWEgbWF5b3IuDQoNCkFob3JhLCBjb24gZXNlIG1vZGVsbywgaGFnYSB1bmEgcHJlZGljY2nDs24gZGUgY3XDoWwgc2Vyw6EgZWwgdGFtYcOxYW8gZGUgbGFzIHBsYW50YXMgZW4gbG9zIGTDrWFzIDQwIHkgNTIuDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGdyb3d0aHJhdGVzKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpQcm9ibGVtYTEgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvZWxlYW4vT25lRHJpdmUvRXNjcml0b3Jpby9Nb2RlbG9zYl9JSUkvUHJvYmxlbWFzX01vZGVsb3MueGxzeCIsIA0KICAgIHNoZWV0ID0gIlByb2JsZW1hMSIpDQpWaWV3KFByb2JsZW1hMSkNCmBgYA0KDQpgYGB7cn0NClByb2JsZW1hMQ0KYGBgDQoNCg0KYGBge3J9DQpQcm9ibGVtYTEgPC0gZGF0YS5mcmFtZSgNCiAgVGllbXBvID0gYyg0MCwgNTIpLA0KICBBbHR1cmEgPSBwcm9ibGVtYTENCikNCmBgYA0KDQpgYGB7cn0NCmNsYXNzKHByb2JsZW1hMSkNCmBgYA0KDQoNCmBgYHtyfQ0KcHJvYmxlbWExIDwtIFByb2JsZW1hMQ0KcHJvbWVkaW8gPC0gbWVhbihQcm9ibGVtYTEkQWx0dXJhKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmdyYWZpY28xIDwtIGdncGxvdChQcm9ibGVtYTEsIGFlcyh4ID0gVGllbXBvLCB5ID0gQWx0dXJhKSkgKw0KICAjIEzDrW5lYSBkZWwgcHJvbWVkaW8gKGF6dWwgY2llbG8gY2xhcm8pDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHByb21lZGlvLCBsaW5ldHlwZSA9ICJkYXNoZWQiLA0KICAgICAgICAgICAgIGNvbG9yID0gIiM3RkEzQzciLCBsaW5ld2lkdGggPSAwLjcpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gbWF4KFByb2JsZW1hMSRUaWVtcG8pLCB5ID0gcHJvbWVkaW8sDQogICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCJQcm9tZWRpbyA9ICIsIHJvdW5kKHByb21lZGlvLCAxKSwgIiBjbSIpLA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNiwgY29sb3IgPSAiI0E5QzRFMCIsIHNpemUgPSA0KSArDQogICMgUmVjdGEgZGUgdGVuZGVuY2lhIGNvbiBiYW5kYSBkZSBjb25maWFuemEgKGFtYXJpbGxvIGx1bmEpDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiNGNEQzNUUiLCBmaWxsID0gIiNFOUI0NEMiLA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuMywgbGluZXdpZHRoID0gMS4yKSArDQogICMgUHVudG9zIHJvaml6b3MNCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjRjI4QzI4IiwgZmlsbCA9ICIjRkZFMDY2Iiwgc2hhcGUgPSAyMSwNCiAgICAgICAgICAgICBzaXplID0gNCwgc3Ryb2tlID0gMSwgYWxwaGEgPSAwLjkpICsNCiAgbGFicygNCiAgICB4ID0gIlRpZW1wbyAoZMOtYXMpIiwNCiAgICB5ID0gIkFsdHVyYSAoY20pIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKw0KICB0aGVtZSgNCiAgICAjIEZvbmRvIGF6dWwgbm9jaGUNCiAgICBwbG90LmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzBCMUY0QiIsIGNvbG9yID0gTkEpLA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMTAyODVFIiwgY29sb3IgPSBOQSksDQogICAgIyBUZXh0b3MgY2xhcm9zDQogICAgcGxvdC50aXRsZSAgICAgICA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjRjREMzVFIiksDQogICAgcGxvdC5zdWJ0aXRsZSAgICA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjQTlDNEUwIiksDQogICAgYXhpcy50aXRsZSAgICAgICA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjRENFNkYyIiksDQogICAgYXhpcy50ZXh0ICAgICAgICA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjQTlDNEUwIiksDQogICAgIyBDdWFkcsOtY3VsYSBzdXRpbCBhenVsYWRhDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIiMxRTNBNzgiKQ0KICApDQpgYGANCg0KYGBge3J9DQpncmFmaWNvMQ0KYGBgDQoNCmBgYHtyfQ0KbW9kX3Byb2IxIDwtIGxtKEFsdHVyYX4gVGllbXBvLCBkYXRhID0gUHJvYmxlbWExKQ0Kc3VtbWFyeShtb2RfcHJvYjEpDQpgYGANCg0KYGBge3J9DQpudWV2b3NfZGF0b3MgPC0gZGF0YS5mcmFtZShUaWVtcG89IGMoNDAsNTIpKQ0KDQpwcmVkaWN0KG1vZF9wcm9iMSwgbnVldm9zX2RhdG9zKQ0KYGBgDQoNCg0KIyMgUmVzcHVlc3RhDQogICAxICAgICAgICAyIA0KMTcuMzI2NjcgMTcuMzI2NjcgDQoNCiMgUHJvYmxlbWEgMg0KDQpMYSBsYXBhIHJvamEgbyBndWFjYW1heWEgcm9qYSAoKkFyYSBtYWNhbyopIGZ1ZSBjYXNpIGVsaW1pbmFkYSBkZSBidWVuYSBwYXJ0ZSBkZWwgUGFjw61maWNvIGRlIENvc3RhIFJpY2EgcG9yIGxhIHDDqXJkaWRhIGRlIGJvc3F1ZSB5IGxhIGNhcHR1cmEgZGUgcG9sbHVlbG9zLiBHcmFjaWFzIGEgcHJvZ3JhbWFzIGRlIGNvbnNlcnZhY2nDs24geSByZWludHJvZHVjY2nDs24sIGFsZ3VuYXMgcG9ibGFjaW9uZXMgc2UgaGFuIHJlY3VwZXJhZG8uDQoNCkltYWdpbmVuIHF1ZSB1biBwcm9ncmFtYSBkZSBjb25zZXJ2YWNpw7NuIGxpYmVyw7MgdW4gZ3J1cG8gcGVxdWXDsW8gZGUgbGFwYXMgcm9qYXMgZW4gdW4gYm9zcXVlIHByb3RlZ2lkbyBkZWwgUGFjw61maWNvIGNlbnRyYWwgeSBsYXMgY2Vuc8OzwqAqKmNhZGEgYcOxbyBkdXJhbnRlIDIwIGHDsW9zKiouIFVzdGVkZXMgZGViZW4gYWp1c3RhciB1bsKgKiptb2RlbG8gbG9nw61zdGljbyoqwqBhIGxvcyBkYXRvcyB5IGVzdGltYXIgbG9zIHBhcsOhbWV0cm9zIHF1ZSBkZXNjcmliZW4gZWwgY3JlY2ltaWVudG8gZGUgZXN0YSBwb2JsYWNpw7NuLiBDb21vIHRvbWFkb3JlcyBkZSBkZWNpc2nDs24sIGVzcGVjaWZpcXVlbiBjdcOhbmRvIGRlYmVyw6EgZGUgdGVybWluYXIgZWwgbW9uaXRvcmVvIGVjb2zDs2dpY28sIHNlZ8O6biBlbCBjb21wb3J0YW1pZW50byBwb2JsYWNpb25hbC4NCg0KDQpgYGB7cn0NCg0KbGlicmFyeShncm93dGhyYXRlcykNCg0KDQpkYXRvcyA8LSBkYXRhLmZyYW1lKA0KICBhbm8gPSAwOjIwLA0KICBwb2JsYWNpb24gPSBjKA0KICAgIDEyLCAxNSwgMjQsIDI5LCA0MywgNTAsIDY5LCA3OSwgMTAxLCAxMDksDQogICAgMTMxLCAxMzYsIDE1MiwgMTU0LCAxNjYsIDE2NSwgMTc0LCAxNzEsIDE3OSwgMTc0LCAxODENCiAgKQ0KDQopDQpgYGANCg0KDQoNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgTU9ERUxPIExPR8ONU1RJQ08NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCg0KYGBge3J9DQptb2RlbG8gPC0gbmxzKA0KICBwb2JsYWNpb24gfiBLIC8gKDEgKyBBICogZXhwKC1yICogYW5vKSksDQogIGRhdGEgPSBkYXRvcywNCiAgc3RhcnQgPSBsaXN0KEsgPSAxOTAsIEEgPSAxNSwgciA9IDAuMykNCikNCmBgYA0KDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIFZFUiBMT1MgUkVTVUxUQURPUyBERUwgTU9ERUxPDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQoNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbG8pDQpgYGANCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBPQlRFTkVSIExPUyBQQVLDgU1FVFJPUw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCmBgYHtyfQ0KSyA8LSBjb2VmKG1vZGVsbylbIksiXQ0KQSA8LSBjb2VmKG1vZGVsbylbIkEiXQ0KciA8LSBjb2VmKG1vZGVsbylbInIiXQ0KYGBgDQoNCksNCkENCnINCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBDUkVBUiBMQSBDVVJWQSBMT0fDjVNUSUNBDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQoNCg0KYGBge3J9DQphbm9fY3VydmEgPC0gc2VxKDAsIDIwLCBsZW5ndGgub3V0ID0gMjAwKQ0KDQpwb2JsYWNpb25fY3VydmEgPC0gSyAvICgxICsgQSAqIGV4cCgtciAqIGFub19jdXJ2YSkpDQpgYGANCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBHUsOBRklDQQ0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KDQoNCmBgYHtyfQ0KcGxvdCgNCiAgZGF0b3MkYW5vLA0KICBkYXRvcyRwb2JsYWNpb24sDQogIHBjaCA9IDE5LA0KICB4bGFiID0gIk11ZXN0cmVvIiwNCiAgeWxhYiA9ICJOw7ptZXJvIGRlIGluZGl2aWR1b3MiLA0KICBtYWluID0gIkNyZWNpbWllbnRvIHBvYmxhY2lvbmFsIGRlIGxhIGxhcGEgcm9qYSAoQXJhIG1hY2FvKSIsDQogIHhsaW0gPSBjKDAsIDIwKSwNCiAgeWxpbSA9IGMoMCwgSyAqIDEuMSkNCikNCmBgYA0KDQoNCiMgQ3VydmEgbG9nw61zdGljYQ0KDQpgYGB7cn0NCmxpbmVzKA0KICBhbm9fY3VydmEsDQogIHBvYmxhY2lvbl9jdXJ2YSwNCiAgbHdkID0gMw0KKQ0KYGBgDQoNCg0KIyBDYXBhY2lkYWQgZGUgY2FyZ2ENCg0KDQpgYGB7cn0NCmFibGluZSgNCiAgaCA9IEssDQogIGx0eSA9IDIsDQogIGx3ZCA9IDINCikNCmBgYA0KDQojIExleWVuZGENCmBgYHtyfQ0KbGVnZW5kKA0KICAiYm90dG9tcmlnaHQiLA0KICBsZWdlbmQgPSBjKA0KICAgICJEYXRvcyBvYnNlcnZhZG9zIiwNCiAgICAiTW9kZWxvIGxvZ8Otc3RpY28iLA0KICAgICJDYXBhY2lkYWQgZGUgY2FyZ2EgKEspIg0KICApLA0KICBwY2ggPSBjKDE5LCBOQSwgTkEpLA0KICBsdHkgPSBjKE5BLCAxLCAyKSwNCiAgbHdkID0gYyhOQSwgMywgMikNCikNCmBgYA0KDQoNCg0KDQojIyBSZXNwdWVzdGENCg0KIyBQcm9ibGVtYSAzDQoNCkVuIGxvcyBib3NxdWVzIG51Ym9zb3MgZGUgbGEgY29yZGlsbGVyYSBkZSBUaWxhcsOhbiwgdW4gYW5maWJpbyBlbmTDqW1pY28gKGVzcGVjaWUgZmljdGljaWEsIGluc3BpcmFkYSBlbiBsbyBvY3VycmlkbyBjb24gZWwgc2FwbyBkb3JhZG8gZGUgTW9udGV2ZXJkZSkgbWFudGVuw61hIHVuYSBwb2JsYWNpw7NuIGVzdGFibGUgZGUgdW5vcyA1MDAgaW5kaXZpZHVvcy4gQSBwYXJ0aXIgZGUgY2llcnRvIG1vbWVudG8sIGxhIGxsZWdhZGEgZGUgdW4gaG9uZ28gcGF0w7NnZW5vIChxdWl0cmlkaW9taWNvc2lzKSB5IGVsIGF1bWVudG8gZGUgbGEgdGVtcGVyYXR1cmEgaGljaWVyb24gcXVlIGxhcyBtdWVydGVzIHN1cGVyYXJhbiBhIGxvcyBuYWNpbWllbnRvcy4gVW4gZXF1aXBvIGRlIGJpw7Nsb2dvcyBjZW5zw7MgbGEgcG9ibGFjacOzbsKgKipjYWRhIGHDsW8gZHVyYW50ZSAxMiBhw7FvcyoqLiAobXVtYXggPSAtMC4zLCBLID0gNTUwKQ0KDQpVc3RlZGVzIGRlYmVuIGFqdXN0YXIgdW7CoCoqbW9kZWxvIGxvZ8Otc3RpY28gY29uIHRhc2EgZGUgY3JlY2ltaWVudG8qKsKgeSB1c2FybG8gcGFyYSBwcmVkZWNpcsKgKipjdcOhbmRvIGRlc2FwYXJlY2Vyw6EgbGEgcG9ibGFjacOzbioqLg0KDQpgYGB7cn0NCg0KIyMgUGFyYSBwcmVkZWNpcjoNCg0KYWp1c3RlIDwtIGZpdF9ncm93dGhtb2RlbCgNCiAgRlVOICAgPSBncm93X2xvZ2lzdGljLA0KICBwICAgICA9IGMoeTAgPSAsIG11bWF4ID0gLCBLID0gKSwgICAjIHZhbG9yZXMgaW5pY2lhbGVzDQogIHRpbWUgID0gdGllbXBvLA0KICB5ICAgICA9IGluZGl2aWR1b3MsDQogIGxvd2VyID0gYyh5MCA9IDEsICAgIG11bWF4ID0gLTMsIEsgPSAxKSwNCiAgdXBwZXIgPSBjKHkwID0gMjAwMCwgbXVtYXggPSAwLCAgSyA9IDUwMDApDQopDQoNCnN1bW1hcnkoYWp1c3RlKQ0KY29lZihhanVzdGUpDQoNCg0KIyMgUHJlZGljY2nDs24gZGUgY3XDoWwgc2Vyw6EgZWwgbsO6bWVybyBkZSBpbmRpdmlkdW9zIGVuIHVuIHRpZW1wbyBkZXRlcm1pbmFkbw0KDQpwIDwtIGNvZWYoYWp1c3RlKQ0KdF9wcmVkIDwtIGMoMjAsNDAsNTApDQpOX3ByZWQgPC0gZ3Jvd19sb2dpc3RpYyh0X3ByZWQsIHApWywgInkiXQ0KDQojIyBQcmVkaWNjacOzbiBkZSBlbiBxdcOpIG1vbWVudG8gbGEgcG9ibGFjacOzbiB2YSBhIHNlciAwDQoNCnRfYWxjYW56YSA8LSBmdW5jdGlvbihOLCBwKSB7DQogIHdpdGgoYXMubGlzdChwKSwgbG9nKE4gKiAoSyAtIHkwKSAvICh5MCAqIChLIC0gTikpKSAvIG11bWF4KQ0KfQ0KdF9hbGNhbnphKDAuMSwgcCkgICAgIyBLLzIgeSA5MCAlIGRlIEsNCg0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KHJlYWR4bCkNClByb2JsZW1hMyA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9lbGVhbi9PbmVEcml2ZS9Fc2NyaXRvcmlvL01vZGVsb3NiX0lJSS9Qcm9ibGVtYXNfTW9kZWxvcy54bHN4IiwgDQogICAgc2hlZXQgPSAiUHJvYmxlbWEzIikNClZpZXcoUHJvYmxlbWEzKQ0KDQpgYGANCg0KYGBge3J9DQoNClByb2JsZW1hMw0KDQpgYGANCg0KYGBge3J9DQoNCmdncGxvdChQcm9ibGVtYTMsIGFlcyh4ID0gTXVlc3RyZW8sIHkgPSBJbmRpdmlkdW9zKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzJFOEI1NyIsIGxpbmV3aWR0aCA9IDEuMikgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gIiMxQjQzMzIiLCBmaWxsID0gIiNCN0UwNEEiLCBzaGFwZSA9IDIxLA0KICAgICAgICAgICAgIHNpemUgPSAzLCBzdHJva2UgPSAwLjgsIGFscGhhID0gMC45NSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBsYWJzKHggPSAiQcOxbyIsIHkgPSAiSW5kaXZpZHVvcyIpDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCmBgYHtyfQ0KDQpQcm9ibGVtYTMNCg0KdGllbXBvIDwtIFByb2JsZW1hMyRNdWVzdHJlbw0KaW5kaXZpZHVvcyA8LSBQcm9ibGVtYTMkSW5kaXZpZHVvcw0KDQpgYGANCg0KDQpgYGB7cn0NCg0KbGlicmFyeShncm93dGhyYXRlcykNCmxpYnJhcnkoZ2dwbG90MikNCg0KIyAxLiBBanVzdGUgZGVsIG1vZGVsbyBsb2fDrXN0aWNvDQphanVzdGUgPC0gZml0X2dyb3d0aG1vZGVsKA0KICBGVU4gICA9IGdyb3dfbG9naXN0aWMsDQogIHAgICAgID0gYyh5MCA9IDUwMCwgbXVtYXggPSAtMC4zLCBLID0gNTUwKSwgICAjIHZhbG9yZXMgaW5pY2lhbGVzDQogIHRpbWUgID0gUHJvYmxlbWEzJE11ZXN0cmVvLA0KICB5ICAgICA9IFByb2JsZW1hMyRJbmRpdmlkdW9zLA0KICBsb3dlciA9IGMoeTAgPSAxLCAgICBtdW1heCA9IC0zLCBLID0gMSksDQogIHVwcGVyID0gYyh5MCA9IDIwMDAsIG11bWF4ID0gMCwgIEsgPSA1MDAwKQ0KKQ0KDQpzdW1tYXJ5KGFqdXN0ZSkNCnAgPC0gY29lZihhanVzdGUpDQpwDQoNCiMgMi4gSW5kaXZpZHVvcyBlbiB0aWVtcG9zIGZ1dHVyb3MNCnRfcHJlZCA8LSBjKDIwLCA0MCwgNTApDQpOX3ByZWQgPC0gZ3Jvd19sb2dpc3RpYyh0X3ByZWQsIHApWywgInkiXQ0KTl9wcmVkDQoNCiMgMy4gVGllbXBvIGVuIHF1ZSBsYSBwb2JsYWNpw7NuIGxsZWdhIGEgdW4gdW1icmFsIGRlIGV4dGluY2nDs24NCnRfYWxjYW56YSA8LSBmdW5jdGlvbihOLCBwKSB7DQogIHdpdGgoYXMubGlzdChwKSwgbG9nKE4gKiAoSyAtIHkwKSAvICh5MCAqIChLIC0gTikpKSAvIG11bWF4KQ0KfQ0KdF9hbGNhbnphKDEsIHApICAgICAjIHF1ZWRhIDEgaW5kaXZpZHVvDQp0X2FsY2FuemEoMC4xLCBwKSAgICMgbWVub3MgZGUgMSBpbmRpdmlkdW8gKGV4dGluY2nDs24gcHLDoWN0aWNhKQ0KDQoNCmBgYA0KDQoNCiMjIFJlc3B1ZXN0YQ0KDQpTZWfDum4gZWwgbW9kZWxvLCBlbiBlbCBhw7FvIDIwIHF1ZWRhcsOtYW4gYXByb3hpbWFkYW1lbnRlIFt2YWxvcl0gaW5kaXZpZHVvcywgZW4gZWwgYcOxbyA0MCBbdmFsb3JdIHkgZW4gZWwgYcOxbyA1MCBbdmFsb3JdLg0K