• A00833113 - Avril Lobato
  • A01771127 - Lesly Darian Romero Vazquez
  • A00831105 - Jazmin del Carmen Cortez Mendoza
  • A01284611 - Lisset Hernández

Contratación de Personal

Probabilidad de ocurrencia general: Alguno de los tres riesgos identificados

Librerías

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(rpart)
library(rpart.plot)

Definimos los parámetros de cada riesgo

riesgos <- data.frame(
  Nombre = c("Riesgo por selección errónea", 
             "Riesgos legales y de cumplimiento", 
             "Riesgo por sesgos o discriminación"),
  Impacto = c(4, 5, 2), # Escala de impacto (1-5)
  Probabilidad = c(0.4, 0.2, 0.3), # Probabilidad de ocurrencia
  Riesgo_Inherente = c(16, 10, 6) # Impacto * Probabilidad en escala 1-5
)

Número de simulaciones

n_sim <- 10000 

Función para simulación de Monte Carlo

simular_riesgos <- function(n_sim, riesgos) {
  resultados <- matrix(0, nrow = n_sim, ncol = nrow(riesgos))
  colnames(resultados) <- riesgos$Nombre
  
  for (i in 1:nrow(riesgos)) {
    resultados[, i] <- rbinom(n_sim, size = 1, prob = riesgos$Probabilidad[i])
  }
  
  return(rowSums(resultados)) # Suma de riesgos ocurridos por simulación
}

Ejecutamos la simulación

set.seed(123) # Para reproducibilidad
resultados_sim <- simular_riesgos(n_sim, riesgos)

Análisis de resultados

probabilidad_al_menos_un_riesgo <- mean(resultados_sim > 0)
promedio_riesgos_ocurridos <- mean(resultados_sim)

Mostrar resultados

cat("Probabilidad estimada de que ocurra al menos un riesgo:", probabilidad_al_menos_un_riesgo, "\n")
## Probabilidad estimada de que ocurra al menos un riesgo: 0.6639
cat("Promedio de riesgos que ocurren por simulación:", promedio_riesgos_ocurridos, "\n")
## Promedio de riesgos que ocurren por simulación: 0.8978

Grafica de resultados

El análisis sugiere que, aunque existe una alta posibilidad de que ocurra al menos un riesgo en el proceso de contratación, es poco probable que todos los riesgos se materialicen al mismo tiempo. Esto indica que aplicar controles efectivos en las áreas críticas (como evaluación de candidatos, cumplimiento normativo y reducción de sesgos) podría minimizar aún más la incidencia de riesgos.

table_resultados <- table(resultados_sim)
barplot(table_resultados / n_sim, 
        main = "Distribución de número de riesgos ocurridos",
        xlab = "Número de riesgos ocurridos", 
        ylab = "Frecuencia relativa",
        col = "blue")

Probabilidad de ocurrencia: Riesgo por selección errónea

El riesgo de selección errónea es alto, ya que en la mayoría de los casos la probabilidad simulada supera el 70%. Existe un 5% de escenarios extremos donde la probabilidad es cercana al 100%, lo que implica que en situaciones desfavorables este riesgo podría ocurrir casi con certeza. Por lo tanto, para mitigar este riesgo, la empresa debería fortalecer sus controles de selección, como mejorar las entrevistas estructuradas y las evaluaciones técnicas.

# Cargar librerías necesarias
library(ggplot2)

# Parámetros del riesgo de selección errónea
impacto <- 4  # Impacto del riesgo (de 1 a 5)
probabilidad <- 4  # Probabilidad de ocurrencia (de 1 a 5)

# Definir parámetros de la distribución Beta para modelar incertidumbre
alpha <- probabilidad + 1
beta <- (5 - probabilidad) + 1

# Simulación de Monte Carlo
set.seed(123)  # Fijar semilla para reproducibilidad
num_simulaciones <- 10000
prob_ocurrencia_simulada <- rbeta(num_simulaciones, alpha, beta)

# Calcular métricas de riesgo
media_probabilidad <- mean(prob_ocurrencia_simulada)
cuantil_95 <- quantile(prob_ocurrencia_simulada, 0.95)

# Visualizar resultados
ggplot(data.frame(prob_ocurrencia_simulada), aes(x = prob_ocurrencia_simulada)) +
  geom_histogram(binwidth = 0.05, fill = "blue", alpha = 0.7, color = "black") +
  geom_vline(aes(xintercept = media_probabilidad), color = "red", linetype = "dashed", size = 1) +
  geom_vline(aes(xintercept = cuantil_95), color = "green", linetype = "dashed", size = 1) +
  labs(title = "Simulación Monte Carlo: Probabilidad de Selección Errónea",
       x = "Probabilidad Simulada",
       y = "Frecuencia") +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# Mostrar resultados clave
cat("Probabilidad media estimada del riesgo:", round(media_probabilidad, 3), "\n")
## Probabilidad media estimada del riesgo: 0.714
cat("Percentil 95% de probabilidad:", round(cuantil_95, 3), "\n")
## Percentil 95% de probabilidad: 0.938

Probabilidad de ocurrencia: Riesgos legales y de cumplimiento

Existe un riesgo moderado-alto en el proceso de contratación, ya que más de la mitad de los escenarios simulados indican problemas potenciales en el proceso. En el 95% de los casos, el riesgo no supera cierto umbral (aproximadamente 85-90%). Sin embargo, hay un 5% de los escenarios donde el riesgo es extremadamente alto, lo que indica la posibilidad de problemas graves en casos excepcionales. Por lo tanto, para mitigar este riesgo, se debe mejorar los controles en el proceso de contratación (validación de antecedentes, auditorías internas).

# Cargar librerías necesarias
library(ggplot2)

# Parámetros del riesgo de selección errónea
impacto <- 5  # Impacto del riesgo (de 1 a 5)
probabilidad <- 5  # Probabilidad de ocurrencia (de 1 a 5)

# Definir parámetros de la distribución Beta para modelar incertidumbre
alpha <- probabilidad + 1
beta <- (5 - probabilidad) + 1

# Simulación de Monte Carlo
set.seed(123)  # Fijar semilla para reproducibilidad
num_simulaciones <- 10000
prob_ocurrencia_simulada <- rbeta(num_simulaciones, alpha, beta)

# Calcular métricas de riesgo
media_probabilidad <- mean(prob_ocurrencia_simulada)
cuantil_95 <- quantile(prob_ocurrencia_simulada, 0.95)

# Visualizar resultados
ggplot(data.frame(prob_ocurrencia_simulada), aes(x = prob_ocurrencia_simulada)) +
  geom_histogram(binwidth = 0.05, fill = "blue", alpha = 0.7, color = "black") +
  geom_vline(aes(xintercept = media_probabilidad), color = "red", linetype = "dashed", size = 1) +
  geom_vline(aes(xintercept = cuantil_95), color = "green", linetype = "dashed", size = 1) +
  labs(title = "Simulación Monte Carlo: Probabilidad de Riesgos legales y de cumplimiento",
       x = "Probabilidad Simulada",
       y = "Frecuencia") +
  theme_minimal()

# Mostrar resultados clave
cat("Probabilidad media estimada del riesgo:", round(media_probabilidad, 3), "\n")
## Probabilidad media estimada del riesgo: 0.858
cat("Percentil 95% de probabilidad:", round(cuantil_95, 3), "\n")
## Percentil 95% de probabilidad: 0.991

Probabilidad de ocurrencia: Riesgo por sesgos o discriminación

La probabilidad media de cometer un error en la selección es alta (85.8%), lo que indica que este riesgo es muy recurrente en las simulaciones. Existe una alta concentración de valores cercanos a 1.0, lo que sugiere que en la mayoría de los escenarios simulados, la probabilidad de que ocurra este riesgo es elevada. El percentil 95 (99.1%) indica que en los casos más extremos, el riesgo de selección errónea se acerca al 100%, lo cual puede ser crítico para la organización. Por lo tanto, para mitigar este riesgo, es necesario reforzar los controles en la contratación, como la verificación de competencias, entrevistas estructuradas y pruebas psicométricas.

# Cargar librerías necesarias
library(ggplot2)

# Parámetros del riesgo de selección errónea
impacto <- 2  # Impacto del riesgo (de 1 a 5)
probabilidad <- 3  # Probabilidad de ocurrencia (de 1 a 5)

# Definir parámetros de la distribución Beta para modelar incertidumbre
alpha <- probabilidad + 1
beta <- (5 - probabilidad) + 1

# Simulación de Monte Carlo
set.seed(123)  # Fijar semilla para reproducibilidad
num_simulaciones <- 10000
prob_ocurrencia_simulada <- rbeta(num_simulaciones, alpha, beta)

# Calcular métricas de riesgo
media_probabilidad <- mean(prob_ocurrencia_simulada)
cuantil_95 <- quantile(prob_ocurrencia_simulada, 0.95)

# Visualizar resultados
ggplot(data.frame(prob_ocurrencia_simulada), aes(x = prob_ocurrencia_simulada)) +
  geom_histogram(binwidth = 0.05, fill = "blue", alpha = 0.7, color = "black") +
  geom_vline(aes(xintercept = media_probabilidad), color = "red", linetype = "dashed", size = 1) +
  geom_vline(aes(xintercept = cuantil_95), color = "green", linetype = "dashed", size = 1) +
  labs(title = "Simulación Monte Carlo: Probabilidad de Riesgo por sesgos o discriminación",
       x = "Probabilidad Simulada",
       y = "Frecuencia") +
  theme_minimal()

# Mostrar resultados clave
cat("Probabilidad media estimada del riesgo:", round(media_probabilidad, 3), "\n")
## Probabilidad media estimada del riesgo: 0.572
cat("Percentil 95% de probabilidad:", round(cuantil_95, 3), "\n")
## Percentil 95% de probabilidad: 0.85
LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAxLiBJbmRpdmlkdWFsLiBEaXNlw7FvIGRlIEluZGljYWRvcmVzIHkgU2ltdWxhY2nDs24gZGUgUmllc2dvcyBlbiB1biBQcm9jZXNvIGRlIE5lZ29jaW8iDQphdXRob3I6ICJFcXVpcG8gNyINCmRhdGU6ICIyMDI1LTAyLTE5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogdW5pdGVkDQogICAgaGlnaGxpZ2h0OiBweWdtZW50cw0KLS0tDQoNCiogQTAwODMzMTEzIC0gQXZyaWwgTG9iYXRvIA0KKiBBMDE3NzExMjcgLSBMZXNseSBEYXJpYW4gUm9tZXJvIFZhenF1ZXoNCiogQTAwODMxMTA1IC0gSmF6bWluIGRlbCBDYXJtZW4gQ29ydGV6IE1lbmRvemENCiogQTAxMjg0NjExIC0gTGlzc2V0IEhlcm7DoW5kZXoNCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojICoqQ29udHJhdGFjacOzbiBkZSBQZXJzb25hbCoqDQoNCiMjICoqUHJvYmFiaWxpZGFkIGRlIG9jdXJyZW5jaWEgZ2VuZXJhbDoqKiBBbGd1bm8gZGUgbG9zIHRyZXMgcmllc2dvcyBpZGVudGlmaWNhZG9zDQoNCiMjIyBMaWJyZXLDrWFzDQpgYGB7ciB9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocnBhcnQpDQpsaWJyYXJ5KHJwYXJ0LnBsb3QpDQpgYGANCg0KIyMjIERlZmluaW1vcyBsb3MgcGFyw6FtZXRyb3MgZGUgY2FkYSByaWVzZ28NCmBgYHtyfQ0Kcmllc2dvcyA8LSBkYXRhLmZyYW1lKA0KICBOb21icmUgPSBjKCJSaWVzZ28gcG9yIHNlbGVjY2nDs24gZXJyw7NuZWEiLCANCiAgICAgICAgICAgICAiUmllc2dvcyBsZWdhbGVzIHkgZGUgY3VtcGxpbWllbnRvIiwgDQogICAgICAgICAgICAgIlJpZXNnbyBwb3Igc2VzZ29zIG8gZGlzY3JpbWluYWNpw7NuIiksDQogIEltcGFjdG8gPSBjKDQsIDUsIDIpLCAjIEVzY2FsYSBkZSBpbXBhY3RvICgxLTUpDQogIFByb2JhYmlsaWRhZCA9IGMoMC40LCAwLjIsIDAuMyksICMgUHJvYmFiaWxpZGFkIGRlIG9jdXJyZW5jaWENCiAgUmllc2dvX0luaGVyZW50ZSA9IGMoMTYsIDEwLCA2KSAjIEltcGFjdG8gKiBQcm9iYWJpbGlkYWQgZW4gZXNjYWxhIDEtNQ0KKQ0KYGBgDQoNCg0KIyMjIE7Dum1lcm8gZGUgc2ltdWxhY2lvbmVzDQpgYGB7cn0NCm5fc2ltIDwtIDEwMDAwIA0KYGBgDQoNCiMjIyBGdW5jacOzbiBwYXJhIHNpbXVsYWNpw7NuIGRlIE1vbnRlIENhcmxvDQpgYGB7cn0NCnNpbXVsYXJfcmllc2dvcyA8LSBmdW5jdGlvbihuX3NpbSwgcmllc2dvcykgew0KICByZXN1bHRhZG9zIDwtIG1hdHJpeCgwLCBucm93ID0gbl9zaW0sIG5jb2wgPSBucm93KHJpZXNnb3MpKQ0KICBjb2xuYW1lcyhyZXN1bHRhZG9zKSA8LSByaWVzZ29zJE5vbWJyZQ0KICANCiAgZm9yIChpIGluIDE6bnJvdyhyaWVzZ29zKSkgew0KICAgIHJlc3VsdGFkb3NbLCBpXSA8LSByYmlub20obl9zaW0sIHNpemUgPSAxLCBwcm9iID0gcmllc2dvcyRQcm9iYWJpbGlkYWRbaV0pDQogIH0NCiAgDQogIHJldHVybihyb3dTdW1zKHJlc3VsdGFkb3MpKSAjIFN1bWEgZGUgcmllc2dvcyBvY3Vycmlkb3MgcG9yIHNpbXVsYWNpw7NuDQp9DQpgYGANCg0KDQojIyMgRWplY3V0YW1vcyBsYSBzaW11bGFjacOzbg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpICMgUGFyYSByZXByb2R1Y2liaWxpZGFkDQpyZXN1bHRhZG9zX3NpbSA8LSBzaW11bGFyX3JpZXNnb3Mobl9zaW0sIHJpZXNnb3MpDQpgYGANCg0KDQojIyMgQW7DoWxpc2lzIGRlIHJlc3VsdGFkb3MNCmBgYHtyfQ0KcHJvYmFiaWxpZGFkX2FsX21lbm9zX3VuX3JpZXNnbyA8LSBtZWFuKHJlc3VsdGFkb3Nfc2ltID4gMCkNCnByb21lZGlvX3JpZXNnb3Nfb2N1cnJpZG9zIDwtIG1lYW4ocmVzdWx0YWRvc19zaW0pDQpgYGANCg0KIyMjIE1vc3RyYXIgcmVzdWx0YWRvcw0KYGBge3J9DQpjYXQoIlByb2JhYmlsaWRhZCBlc3RpbWFkYSBkZSBxdWUgb2N1cnJhIGFsIG1lbm9zIHVuIHJpZXNnbzoiLCBwcm9iYWJpbGlkYWRfYWxfbWVub3NfdW5fcmllc2dvLCAiXG4iKQ0KY2F0KCJQcm9tZWRpbyBkZSByaWVzZ29zIHF1ZSBvY3VycmVuIHBvciBzaW11bGFjacOzbjoiLCBwcm9tZWRpb19yaWVzZ29zX29jdXJyaWRvcywgIlxuIikNCmBgYA0KDQojIyMgR3JhZmljYSBkZSByZXN1bHRhZG9zDQoNCkVsIGFuw6FsaXNpcyBzdWdpZXJlIHF1ZSwgYXVucXVlIGV4aXN0ZSB1bmEgYWx0YSBwb3NpYmlsaWRhZCBkZSBxdWUgb2N1cnJhIGFsIG1lbm9zIHVuIHJpZXNnbyBlbiBlbCBwcm9jZXNvIGRlIGNvbnRyYXRhY2nDs24sIGVzIHBvY28gcHJvYmFibGUgcXVlIHRvZG9zIGxvcyByaWVzZ29zIHNlIG1hdGVyaWFsaWNlbiBhbCBtaXNtbyB0aWVtcG8uIEVzdG8gaW5kaWNhIHF1ZSBhcGxpY2FyIGNvbnRyb2xlcyBlZmVjdGl2b3MgZW4gbGFzIMOhcmVhcyBjcsOtdGljYXMgKGNvbW8gZXZhbHVhY2nDs24gZGUgY2FuZGlkYXRvcywgY3VtcGxpbWllbnRvIG5vcm1hdGl2byB5IHJlZHVjY2nDs24gZGUgc2VzZ29zKSBwb2Ryw61hIG1pbmltaXphciBhw7puIG3DoXMgbGEgaW5jaWRlbmNpYSBkZSByaWVzZ29zLg0KDQpgYGB7cn0NCnRhYmxlX3Jlc3VsdGFkb3MgPC0gdGFibGUocmVzdWx0YWRvc19zaW0pDQpiYXJwbG90KHRhYmxlX3Jlc3VsdGFkb3MgLyBuX3NpbSwgDQogICAgICAgIG1haW4gPSAiRGlzdHJpYnVjacOzbiBkZSBuw7ptZXJvIGRlIHJpZXNnb3Mgb2N1cnJpZG9zIiwNCiAgICAgICAgeGxhYiA9ICJOw7ptZXJvIGRlIHJpZXNnb3Mgb2N1cnJpZG9zIiwgDQogICAgICAgIHlsYWIgPSAiRnJlY3VlbmNpYSByZWxhdGl2YSIsDQogICAgICAgIGNvbCA9ICJibHVlIikNCmBgYA0KDQojIyAqKlByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhOioqIFJpZXNnbyBwb3Igc2VsZWNjacOzbiBlcnLDs25lYQ0KRWwgcmllc2dvIGRlIHNlbGVjY2nDs24gZXJyw7NuZWEgZXMgYWx0bywgeWEgcXVlIGVuIGxhIG1heW9yw61hIGRlIGxvcyBjYXNvcyBsYSBwcm9iYWJpbGlkYWQgc2ltdWxhZGEgc3VwZXJhIGVsIDcwJS4gRXhpc3RlIHVuIDUlIGRlIGVzY2VuYXJpb3MgZXh0cmVtb3MgZG9uZGUgbGEgcHJvYmFiaWxpZGFkIGVzIGNlcmNhbmEgYWwgMTAwJSwgbG8gcXVlIGltcGxpY2EgcXVlIGVuIHNpdHVhY2lvbmVzIGRlc2Zhdm9yYWJsZXMgZXN0ZSByaWVzZ28gcG9kcsOtYSBvY3VycmlyIGNhc2kgY29uIGNlcnRlemEuIFBvciBsbyB0YW50bywgcGFyYSBtaXRpZ2FyIGVzdGUgcmllc2dvLCBsYSBlbXByZXNhIGRlYmVyw61hIGZvcnRhbGVjZXIgc3VzIGNvbnRyb2xlcyBkZSBzZWxlY2Npw7NuLCBjb21vIG1lam9yYXIgbGFzIGVudHJldmlzdGFzIGVzdHJ1Y3R1cmFkYXMgeSBsYXMgZXZhbHVhY2lvbmVzIHTDqWNuaWNhcy4NCg0KYGBge3J9DQojIENhcmdhciBsaWJyZXLDrWFzIG5lY2VzYXJpYXMNCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBQYXLDoW1ldHJvcyBkZWwgcmllc2dvIGRlIHNlbGVjY2nDs24gZXJyw7NuZWENCmltcGFjdG8gPC0gNCAgIyBJbXBhY3RvIGRlbCByaWVzZ28gKGRlIDEgYSA1KQ0KcHJvYmFiaWxpZGFkIDwtIDQgICMgUHJvYmFiaWxpZGFkIGRlIG9jdXJyZW5jaWEgKGRlIDEgYSA1KQ0KDQojIERlZmluaXIgcGFyw6FtZXRyb3MgZGUgbGEgZGlzdHJpYnVjacOzbiBCZXRhIHBhcmEgbW9kZWxhciBpbmNlcnRpZHVtYnJlDQphbHBoYSA8LSBwcm9iYWJpbGlkYWQgKyAxDQpiZXRhIDwtICg1IC0gcHJvYmFiaWxpZGFkKSArIDENCg0KIyBTaW11bGFjacOzbiBkZSBNb250ZSBDYXJsbw0Kc2V0LnNlZWQoMTIzKSAgIyBGaWphciBzZW1pbGxhIHBhcmEgcmVwcm9kdWNpYmlsaWRhZA0KbnVtX3NpbXVsYWNpb25lcyA8LSAxMDAwMA0KcHJvYl9vY3VycmVuY2lhX3NpbXVsYWRhIDwtIHJiZXRhKG51bV9zaW11bGFjaW9uZXMsIGFscGhhLCBiZXRhKQ0KDQojIENhbGN1bGFyIG3DqXRyaWNhcyBkZSByaWVzZ28NCm1lZGlhX3Byb2JhYmlsaWRhZCA8LSBtZWFuKHByb2Jfb2N1cnJlbmNpYV9zaW11bGFkYSkNCmN1YW50aWxfOTUgPC0gcXVhbnRpbGUocHJvYl9vY3VycmVuY2lhX3NpbXVsYWRhLCAwLjk1KQ0KDQojIFZpc3VhbGl6YXIgcmVzdWx0YWRvcw0KZ2dwbG90KGRhdGEuZnJhbWUocHJvYl9vY3VycmVuY2lhX3NpbXVsYWRhKSwgYWVzKHggPSBwcm9iX29jdXJyZW5jaWFfc2ltdWxhZGEpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wNSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjcsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVkaWFfcHJvYmFiaWxpZGFkKSwgY29sb3IgPSAicmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IGN1YW50aWxfOTUpLCBjb2xvciA9ICJncmVlbiIsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAxKSArDQogIGxhYnModGl0bGUgPSAiU2ltdWxhY2nDs24gTW9udGUgQ2FybG86IFByb2JhYmlsaWRhZCBkZSBTZWxlY2Npw7NuIEVycsOzbmVhIiwNCiAgICAgICB4ID0gIlByb2JhYmlsaWRhZCBTaW11bGFkYSIsDQogICAgICAgeSA9ICJGcmVjdWVuY2lhIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBNb3N0cmFyIHJlc3VsdGFkb3MgY2xhdmUNCmNhdCgiUHJvYmFiaWxpZGFkIG1lZGlhIGVzdGltYWRhIGRlbCByaWVzZ286Iiwgcm91bmQobWVkaWFfcHJvYmFiaWxpZGFkLCAzKSwgIlxuIikNCmNhdCgiUGVyY2VudGlsIDk1JSBkZSBwcm9iYWJpbGlkYWQ6Iiwgcm91bmQoY3VhbnRpbF85NSwgMyksICJcbiIpDQpgYGANCg0KIyMgKipQcm9iYWJpbGlkYWQgZGUgb2N1cnJlbmNpYToqKiBSaWVzZ29zIGxlZ2FsZXMgeSBkZSBjdW1wbGltaWVudG8gDQpFeGlzdGUgdW4gcmllc2dvIG1vZGVyYWRvLWFsdG8gZW4gZWwgcHJvY2VzbyBkZSBjb250cmF0YWNpw7NuLCB5YSBxdWUgbcOhcyBkZSBsYSBtaXRhZCBkZSBsb3MgZXNjZW5hcmlvcyBzaW11bGFkb3MgaW5kaWNhbiBwcm9ibGVtYXMgcG90ZW5jaWFsZXMgZW4gZWwgcHJvY2Vzby4gRW4gZWwgOTUlIGRlIGxvcyBjYXNvcywgZWwgcmllc2dvIG5vIHN1cGVyYSBjaWVydG8gdW1icmFsIChhcHJveGltYWRhbWVudGUgODUtOTAlKS4gU2luIGVtYmFyZ28sIGhheSB1biA1JSBkZSBsb3MgZXNjZW5hcmlvcyBkb25kZSBlbCByaWVzZ28gZXMgZXh0cmVtYWRhbWVudGUgYWx0bywgbG8gcXVlIGluZGljYSBsYSBwb3NpYmlsaWRhZCBkZSBwcm9ibGVtYXMgZ3JhdmVzIGVuIGNhc29zIGV4Y2VwY2lvbmFsZXMuIFBvciBsbyB0YW50bywgcGFyYSBtaXRpZ2FyIGVzdGUgcmllc2dvLCBzZSBkZWJlIG1lam9yYXIgbG9zIGNvbnRyb2xlcyBlbiBlbCBwcm9jZXNvIGRlIGNvbnRyYXRhY2nDs24gKHZhbGlkYWNpw7NuIGRlIGFudGVjZWRlbnRlcywgYXVkaXRvcsOtYXMgaW50ZXJuYXMpLg0KDQpgYGB7cn0NCiMgQ2FyZ2FyIGxpYnJlcsOtYXMgbmVjZXNhcmlhcw0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFBhcsOhbWV0cm9zIGRlbCByaWVzZ28gZGUgc2VsZWNjacOzbiBlcnLDs25lYQ0KaW1wYWN0byA8LSA1ICAjIEltcGFjdG8gZGVsIHJpZXNnbyAoZGUgMSBhIDUpDQpwcm9iYWJpbGlkYWQgPC0gNSAgIyBQcm9iYWJpbGlkYWQgZGUgb2N1cnJlbmNpYSAoZGUgMSBhIDUpDQoNCiMgRGVmaW5pciBwYXLDoW1ldHJvcyBkZSBsYSBkaXN0cmlidWNpw7NuIEJldGEgcGFyYSBtb2RlbGFyIGluY2VydGlkdW1icmUNCmFscGhhIDwtIHByb2JhYmlsaWRhZCArIDENCmJldGEgPC0gKDUgLSBwcm9iYWJpbGlkYWQpICsgMQ0KDQojIFNpbXVsYWNpw7NuIGRlIE1vbnRlIENhcmxvDQpzZXQuc2VlZCgxMjMpICAjIEZpamFyIHNlbWlsbGEgcGFyYSByZXByb2R1Y2liaWxpZGFkDQpudW1fc2ltdWxhY2lvbmVzIDwtIDEwMDAwDQpwcm9iX29jdXJyZW5jaWFfc2ltdWxhZGEgPC0gcmJldGEobnVtX3NpbXVsYWNpb25lcywgYWxwaGEsIGJldGEpDQoNCiMgQ2FsY3VsYXIgbcOpdHJpY2FzIGRlIHJpZXNnbw0KbWVkaWFfcHJvYmFiaWxpZGFkIDwtIG1lYW4ocHJvYl9vY3VycmVuY2lhX3NpbXVsYWRhKQ0KY3VhbnRpbF85NSA8LSBxdWFudGlsZShwcm9iX29jdXJyZW5jaWFfc2ltdWxhZGEsIDAuOTUpDQoNCiMgVmlzdWFsaXphciByZXN1bHRhZG9zDQpnZ3Bsb3QoZGF0YS5mcmFtZShwcm9iX29jdXJyZW5jaWFfc2ltdWxhZGEpLCBhZXMoeCA9IHByb2Jfb2N1cnJlbmNpYV9zaW11bGFkYSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjA1LCBmaWxsID0gImJsdWUiLCBhbHBoYSA9IDAuNywgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWRpYV9wcm9iYWJpbGlkYWQpLCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMSkgKw0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gY3VhbnRpbF85NSksIGNvbG9yID0gImdyZWVuIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJTaW11bGFjacOzbiBNb250ZSBDYXJsbzogUHJvYmFiaWxpZGFkIGRlIFJpZXNnb3MgbGVnYWxlcyB5IGRlIGN1bXBsaW1pZW50byIsDQogICAgICAgeCA9ICJQcm9iYWJpbGlkYWQgU2ltdWxhZGEiLA0KICAgICAgIHkgPSAiRnJlY3VlbmNpYSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgTW9zdHJhciByZXN1bHRhZG9zIGNsYXZlDQpjYXQoIlByb2JhYmlsaWRhZCBtZWRpYSBlc3RpbWFkYSBkZWwgcmllc2dvOiIsIHJvdW5kKG1lZGlhX3Byb2JhYmlsaWRhZCwgMyksICJcbiIpDQpjYXQoIlBlcmNlbnRpbCA5NSUgZGUgcHJvYmFiaWxpZGFkOiIsIHJvdW5kKGN1YW50aWxfOTUsIDMpLCAiXG4iKQ0KYGBgDQoNCiMjICoqUHJvYmFiaWxpZGFkIGRlIG9jdXJyZW5jaWE6KiogUmllc2dvIHBvciBzZXNnb3MgbyBkaXNjcmltaW5hY2nDs24NCkxhIHByb2JhYmlsaWRhZCBtZWRpYSBkZSBjb21ldGVyIHVuIGVycm9yIGVuIGxhIHNlbGVjY2nDs24gZXMgYWx0YSAoODUuOCUpLCBsbyBxdWUgaW5kaWNhIHF1ZSBlc3RlIHJpZXNnbyBlcyBtdXkgcmVjdXJyZW50ZSBlbiBsYXMgc2ltdWxhY2lvbmVzLiBFeGlzdGUgdW5hIGFsdGEgY29uY2VudHJhY2nDs24gZGUgdmFsb3JlcyBjZXJjYW5vcyBhIDEuMCwgbG8gcXVlIHN1Z2llcmUgcXVlIGVuIGxhIG1heW9yw61hIGRlIGxvcyBlc2NlbmFyaW9zIHNpbXVsYWRvcywgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBvY3VycmEgZXN0ZSByaWVzZ28gZXMgZWxldmFkYS4gRWwgcGVyY2VudGlsIDk1ICg5OS4xJSkgaW5kaWNhIHF1ZSBlbiBsb3MgY2Fzb3MgbcOhcyBleHRyZW1vcywgZWwgcmllc2dvIGRlIHNlbGVjY2nDs24gZXJyw7NuZWEgc2UgYWNlcmNhIGFsIDEwMCUsIGxvIGN1YWwgcHVlZGUgc2VyIGNyw610aWNvIHBhcmEgbGEgb3JnYW5pemFjacOzbi4gUG9yIGxvIHRhbnRvLCBwYXJhIG1pdGlnYXIgZXN0ZSByaWVzZ28sIGVzIG5lY2VzYXJpbyByZWZvcnphciBsb3MgY29udHJvbGVzIGVuIGxhIGNvbnRyYXRhY2nDs24sIGNvbW8gbGEgdmVyaWZpY2FjacOzbiBkZSBjb21wZXRlbmNpYXMsIGVudHJldmlzdGFzIGVzdHJ1Y3R1cmFkYXMgeSBwcnVlYmFzIHBzaWNvbcOpdHJpY2FzLg0KDQpgYGB7cn0NCiMgQ2FyZ2FyIGxpYnJlcsOtYXMgbmVjZXNhcmlhcw0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFBhcsOhbWV0cm9zIGRlbCByaWVzZ28gZGUgc2VsZWNjacOzbiBlcnLDs25lYQ0KaW1wYWN0byA8LSAyICAjIEltcGFjdG8gZGVsIHJpZXNnbyAoZGUgMSBhIDUpDQpwcm9iYWJpbGlkYWQgPC0gMyAgIyBQcm9iYWJpbGlkYWQgZGUgb2N1cnJlbmNpYSAoZGUgMSBhIDUpDQoNCiMgRGVmaW5pciBwYXLDoW1ldHJvcyBkZSBsYSBkaXN0cmlidWNpw7NuIEJldGEgcGFyYSBtb2RlbGFyIGluY2VydGlkdW1icmUNCmFscGhhIDwtIHByb2JhYmlsaWRhZCArIDENCmJldGEgPC0gKDUgLSBwcm9iYWJpbGlkYWQpICsgMQ0KDQojIFNpbXVsYWNpw7NuIGRlIE1vbnRlIENhcmxvDQpzZXQuc2VlZCgxMjMpICAjIEZpamFyIHNlbWlsbGEgcGFyYSByZXByb2R1Y2liaWxpZGFkDQpudW1fc2ltdWxhY2lvbmVzIDwtIDEwMDAwDQpwcm9iX29jdXJyZW5jaWFfc2ltdWxhZGEgPC0gcmJldGEobnVtX3NpbXVsYWNpb25lcywgYWxwaGEsIGJldGEpDQoNCiMgQ2FsY3VsYXIgbcOpdHJpY2FzIGRlIHJpZXNnbw0KbWVkaWFfcHJvYmFiaWxpZGFkIDwtIG1lYW4ocHJvYl9vY3VycmVuY2lhX3NpbXVsYWRhKQ0KY3VhbnRpbF85NSA8LSBxdWFudGlsZShwcm9iX29jdXJyZW5jaWFfc2ltdWxhZGEsIDAuOTUpDQoNCiMgVmlzdWFsaXphciByZXN1bHRhZG9zDQpnZ3Bsb3QoZGF0YS5mcmFtZShwcm9iX29jdXJyZW5jaWFfc2ltdWxhZGEpLCBhZXMoeCA9IHByb2Jfb2N1cnJlbmNpYV9zaW11bGFkYSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjA1LCBmaWxsID0gImJsdWUiLCBhbHBoYSA9IDAuNywgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWRpYV9wcm9iYWJpbGlkYWQpLCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMSkgKw0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gY3VhbnRpbF85NSksIGNvbG9yID0gImdyZWVuIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJTaW11bGFjacOzbiBNb250ZSBDYXJsbzogUHJvYmFiaWxpZGFkIGRlIFJpZXNnbyBwb3Igc2VzZ29zIG8gZGlzY3JpbWluYWNpw7NuIiwNCiAgICAgICB4ID0gIlByb2JhYmlsaWRhZCBTaW11bGFkYSIsDQogICAgICAgeSA9ICJGcmVjdWVuY2lhIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBNb3N0cmFyIHJlc3VsdGFkb3MgY2xhdmUNCmNhdCgiUHJvYmFiaWxpZGFkIG1lZGlhIGVzdGltYWRhIGRlbCByaWVzZ286Iiwgcm91bmQobWVkaWFfcHJvYmFiaWxpZGFkLCAzKSwgIlxuIikNCmNhdCgiUGVyY2VudGlsIDk1JSBkZSBwcm9iYWJpbGlkYWQ6Iiwgcm91bmQoY3VhbnRpbF85NSwgMyksICJcbiIpDQpgYGANCg0KDQo=