1 Introducción

El Modelo de Pronóstico de Producción permite estimar el comportamiento futuro de un campo activo de petróleo, mediante el análisis de su historia de producción.

El modelo emplea un algoritmo basado en el análisis del comportamiento de la historia de producción de todos los pozos del campo y genera un pronóstico en función del tiempo. El algoritmo usado por el modelo determina mediante múltiples iteraciones, ciertos parámetros particulares óptimos del campo que minimizan las diferencias entre la historia de producción actual y el pronóstico de producción del campo.

2 Usos del Modelo

A partir de los resultados del modelo, se podrían evaluar diversos escenarios relevantes que tengan por objetivo, seleccionar la mejor opción que maximice el valor económico del negocio.

Algunas de las aplicaciones del modelo podrían estar relacionadas con:

  • Comprobar que tan razonable es la estimación de las reservas probadas oficiales del campo.
  • Validar el límite económico del campo.
  • Cuantificar la efectividad de ciertas estrategias de producción del campo.

2.0.1 Términos utilizados

Algunos de los términos usados en el presente documento y su significado se mencionan a continuación:

  • Reservas Probadas: Son los volúmenes de hidrocarburos estimados con razonable certeza y que serían recuperables de yacimientos conocidos, de acuerdo con la información geológica y de ingeniería disponible y bajo condiciones operacionales, económicas y regulaciones gubernamentales prevalecientes.

  • Q Modelo: Se refiere a la estimación del volumen de hidrocarburos realizado por el Modelo de Pronóstico de Producción.

  • EUR: Volumen de petróleo estimado a ser recuperado al final de la vida útil del campo. Está relacionado con el volumen producido y las reservas probadas. En ciertas ocasiones los términos EUR y Q Modelo son equivalentes.

  • Ventana del Pronóstico de Producción: Tiempo expresado en meses, usado por el modelo para calcular el pronóstico de producción, también es utilizado para validar, la estimación de las reservas probadas del campo.

  • Volumen Adicional Producido: Es el volumen que resulta al aplicar la Ventana del Pronóstico de Producción.

  • Tasa de Producción al Final de la Ventana de Producción: Se refiere a la tasa de producción del campo, expresadas en barriles por día (bd) qué tendría el campo y que ha sido calculada al usar la Ventana del Pronóstico de Producción.

3 Resultados

3.1 Resumen Producción

El modelo utiliza la historia de producción de los pozos del campo, representado por el volumen diario expresado en miles barriles por día (mbd) producido por los pozos durante un mes.

A partir de esos datos, el modelo calcula la producción acumulada, generalmente expresadas en millones de barriles (mmb).

La siguiente figura muestra la producción acumulada de los pozos productores del campo.

El área del rectángulo representa aproximadamente el volumen producido por el pozo indicado.

3.2 Historia de Producción

La siguiente figura muestra la historia de producción q (mbd) y la producción acumulada Q (mmb) del campo.

3.3 Precisión del Modelo

El modelo utiliza como dato de entrada, la producción acumulada real del campo Q (mmb) y a partir de allí, genera como resultado, una curva de producción acumulada denominada Q Modelo.

Para los efectos de determinar la precisión de la estimación, se compara el volumen acumulado Q (mmb) con el volumen calculado por el modelo Q Modelo (mmb). Para ello se utiliza un valor nulo para la Ventana del Pronóstico de Producción, esto significa que el modelo realizará la estimación, a la fecha actual de la historia de producción del campo.

La siguiente figura muestra los resultados de la comparación:

  • Producción Acumulada.
  • Q Modelo.
  • Diferencia de los Volúmenes Anteriores.

Una diferencia muy baja de la producción acumulada real del campo vs. el volumen estimado por el modelo, indicaría que el modelo es bastante preciso.

3.4 Pronóstico Volumen Adicional

El modelo se puede utilizar para simular diversas situaciones. Al cambiar el valor de la Ventana del Pronóstico de Producción a un número arbitrario, como el indicado en la figura, se obtienen los resultados mostrados a continuación:

El resultado asociado al Pronóstico Volumen Adicional representa el volumen que el modelo estima que será producido por el campo, en una ventana del pronóstico de producción indicado en la figura anterior.

3.5 Producción Diaria y Tasa de Producción Final Estimada

De los resultados del modelo, también se puede calcular la Producción Diaria del Modelo, a partir de la cual, se determina la Tasa de Producción al Final de la Ventana de Producción.

El valor de esa tasa podría estar relacionado con varios factores, tales como:

  • Límite económico del campo.
  • Grado de agotamiento.
  • Nivel de reservas probadas.

3.6 Comparación Reservas Probadas y Volumen Adicional Producido

La siguiente figura muestra la historia de la evolución de la estimación de reservas (probadas, probables y posibles) del campo.

Los volúmenes Q Modelo que resultan de la utilización del modelo, pueden ser comparados con las Reservas Probadas del campo. Debido a que conceptualmente y bajo ciertas circunstancias, ambas cantidades podrían representar aproximadamente lo mismo.

El modelo puede ser utilizado para comprobar la estimación de las reservas probadas, ello se realiza mediante la utilización de valores apropiados de la Ventana del Pronóstico de Producción para generar el Volumen Adicional Producido, éste último al ser comparado con las Reservas Probadas permite cotejar qué tan razonable es el volumen estimado de reservas probadas oficiales del campo.

4 Evaluación Económica

La evaluación económica del campo depende de una variedad de factores que están relacionados con: i) el precio de los hidrocarburos producidos; ii) los costos asociados a las inversiones y gastos operativos; iii) regulaciones gubernamentales prevalecientes, entre otros.

Para los efectos del modelo de pronóstico de producción se utiliza una evaluación económica simplificada, que consiste en emplear solamente precios, gastos operativos, tasa de descuento y el volumen adicional estimado por el modelo considerando una ventana de pronóstico de producción específica.

4.1 Valores Utilizados

4.2 Resultados Evaluación Económica

El siguiente gráfico muestra los resultados finales de las estimaciones:

  • Producción Acumulada del campo (mmb)
  • Reservas Probadas Oficiales (mmb).
  • Pronóstico del Volumen Adicional Estimado por el Modelo (mmb).
  • Tasa de Producción al Final de la Ventana Pronóstico (mbd).
  • Valor Presente Neto (mmusd).

Time difference of 12.33419 secs
LS0tCnRpdGxlOiAiTW9kZWxvIGRlIFByb27Ds3N0aWNvIGRlIFByb2R1Y2Npw7NuIgphdXRob3I6ICJFdWxlckVuZXJneUBnbWFpbC5jb20iCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRoZW1lOiBzaW1wbGV4CiAgICBjc3M6IH4vUi9mYS92aWduZXR0ZXMvc3R5bGUuY3NzCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCi0tLQoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBjbGVhciB3b3Jrc3BhY2UKcm0obGlzdCA9IGxzKCkpCnN0YXJ0X3RpbWUgPC0gU3lzLnRpbWUoKQojIGxvYWQgbGlicmFyaWVzCmxpYnJhcnkoInBuZyIpCmxpYnJhcnkoInRpZHl2ZXJzZSIpCmxpYnJhcnkoIm5scy5tdWx0c3RhcnQiKQpsaWJyYXJ5KCJocmJydGhlbWVzIikKbGlicmFyeSgiYnJvb20iKQpsaWJyYXJ5KCJ2aXJpZGlzIikKbGlicmFyeSgidmlyaWRpc0xpdGUiKQpsaWJyYXJ5KCJ0cmVlbWFwIikKbGlicmFyeSgiZmxleGRhc2hib2FyZCIpCmxpYnJhcnkoImx1YnJpZGF0ZSIpCgojIGh0dHBzOi8vaHRtbGNvbG9yY29kZXMuY29tCgpjb2xvdXJfdXNlZCA8LSB0aWJibGUoCiAgdmFyID0gYygibWJkIGRhdG8iLCAibW1iIGRhdG8iLCAibWJkIG1vZGVsbyIsICJtbWIgbW9kZWxvIiksIAogIG5hbWUgPSBjKCJhenVsIiwgInJvam8iLCAidmVyZGUiLCAibmFyYW5qYSIpLAogIGNvbG91ciA9IGMoIiM2NThlZDQiLCAiI0U4M0MxNyIsICIjODFDNDA4IiwgIiNGRkMzMDAiKSkKCnRoZW1lX3NldChocmJydGhlbWVzOjp0aGVtZV9pcHN1bShiYXNlX3NpemUgPSAxMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNfdGl0bGVfc2l6ZSA9IDE0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb25fc2l6ZSA9IDEyKSkKCnNvdXJjZSgifi9SL2ZhL1IvZnVuY3Rpb25zX0ZBX25vdGVib29rLlIiKQoKIyBsb2FkIHByb2R1Y3Rpb24gZGF0YQpzZXR3ZCgifi9SL2ZhL2RhdGEvcHJvY2Vzc2VkIikKd2VsbF9wcm9kX2RhdGEgPC0gcmVhZFJEUyhmaWxlID0gInByb2QuUmRhIikKCiMgbG9hZCByZXNlcnZlIGRhdGEKc2V0d2QoIn4vUi9mYS9kYXRhL3Byb2Nlc3NlZCIpCnJlc2VydmFzIDwtIHJlYWRSRFMoZmlsZSA9ICJyZXMuUmRhIikKYGBgCgpgYGB7ciBldmFsPUZBTFNFLCBmaWcuaGVpZ2h0PTIsIGZpZy53aWR0aD0zLjUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmJhbGwgPC0gcmVhZFBORygifi9Eb2N1bWVudHMvZXVsZXIgZW5lcmd5L2xvZ28ucG5nIiwgbmF0aXZlID0gVFJVRSkKcGxvdCgwOjEsIDA6MSwgdHlwZSA9ICJuIiwgYW5uID0gRkFMU0UsIGF4ZXMgPSBGQUxTRSkKcmFzdGVySW1hZ2UoYmFsbCwgMCwgMCwgMSwgMSkKYGBgCgojIEludHJvZHVjY2nDs24KCkVsICoqTW9kZWxvIGRlIFByb27Ds3N0aWNvIGRlIFByb2R1Y2Npw7NuKiogcGVybWl0ZSBlc3RpbWFyIGVsIGNvbXBvcnRhbWllbnRvIGZ1dHVybyBkZSB1biBjYW1wbyBhY3Rpdm8gZGUgcGV0csOzbGVvLCBtZWRpYW50ZSBlbCBhbsOhbGlzaXMgZGUgc3UgaGlzdG9yaWEgZGUgcHJvZHVjY2nDs24uCgpFbCBtb2RlbG8gZW1wbGVhIHVuIGFsZ29yaXRtbyBiYXNhZG8gZW4gZWwgYW7DoWxpc2lzIGRlbCBjb21wb3J0YW1pZW50byBkZSBsYSBoaXN0b3JpYSBkZSBwcm9kdWNjacOzbiBkZSB0b2RvcyBsb3MgcG96b3MgZGVsIGNhbXBvIHkgZ2VuZXJhIHVuIHByb27Ds3N0aWNvIGVuIGZ1bmNpw7NuIGRlbCB0aWVtcG8uICBFbCBhbGdvcml0bW8gdXNhZG8gcG9yIGVsIG1vZGVsbyBkZXRlcm1pbmEgbWVkaWFudGUgbcO6bHRpcGxlcyBpdGVyYWNpb25lcywgY2llcnRvcyBwYXLDoW1ldHJvcyBwYXJ0aWN1bGFyZXMgw7NwdGltb3MgZGVsIGNhbXBvIHF1ZSBtaW5pbWl6YW4gbGFzIGRpZmVyZW5jaWFzIGVudHJlIGxhIGhpc3RvcmlhIGRlIHByb2R1Y2Npw7NuIGFjdHVhbCB5IGVsIHByb27Ds3N0aWNvIGRlIHByb2R1Y2Npw7NuIGRlbCBjYW1wby4gICAKCiMgVXNvcyBkZWwgTW9kZWxvCgpBIHBhcnRpciBkZSBsb3MgcmVzdWx0YWRvcyBkZWwgbW9kZWxvLCBzZSBwb2Ryw61hbiBldmFsdWFyIGRpdmVyc29zIGVzY2VuYXJpb3MgcmVsZXZhbnRlcyBxdWUgdGVuZ2FuIHBvciBvYmpldGl2bywgc2VsZWNjaW9uYXIgbGEgbWVqb3Igb3BjacOzbiBxdWUgbWF4aW1pY2UgZWwgdmFsb3IgZWNvbsOzbWljbyBkZWwgbmVnb2Npby4gCgpBbGd1bmFzIGRlIGxhcyBhcGxpY2FjaW9uZXMgZGVsIG1vZGVsbyBwb2Ryw61hbiBlc3RhciByZWxhY2lvbmFkYXMgY29uOgoKICAtIENvbXByb2JhciBxdWUgdGFuIHJhem9uYWJsZSBlcyBsYSBlc3RpbWFjacOzbiBkZSBsYXMgKipyZXNlcnZhcyBwcm9iYWRhcyBvZmljaWFsZXMqKiBkZWwgY2FtcG8uICAgIAogIC0gVmFsaWRhciBlbCBsw61taXRlIGVjb27Ds21pY28gZGVsIGNhbXBvLiAgCiAgLSBDdWFudGlmaWNhciBsYSBlZmVjdGl2aWRhZCBkZSBjaWVydGFzIGVzdHJhdGVnaWFzIGRlIHByb2R1Y2Npw7NuIGRlbCBjYW1wby4gICAKCiMjIyBUw6lybWlub3MgdXRpbGl6YWRvcyAgIAoKQWxndW5vcyBkZSBsb3MgdMOpcm1pbm9zIHVzYWRvcyBlbiBlbCBwcmVzZW50ZSBkb2N1bWVudG8geSBzdSBzaWduaWZpY2FkbyBzZSBtZW5jaW9uYW4gYSBjb250aW51YWNpw7NuOgoKLSAqKlJlc2VydmFzIFByb2JhZGFzKio6IFNvbiBsb3Mgdm9sw7ptZW5lcyBkZSBoaWRyb2NhcmJ1cm9zIGVzdGltYWRvcyBjb24gKipyYXpvbmFibGUgY2VydGV6YSoqIHkgcXVlIHNlcsOtYW4gcmVjdXBlcmFibGVzIGRlIHlhY2ltaWVudG9zIGNvbm9jaWRvcywgZGUgYWN1ZXJkbyBjb24gbGEgaW5mb3JtYWNpw7NuIGdlb2zDs2dpY2EgeSBkZSBpbmdlbmllcsOtYSAqKmRpc3BvbmlibGUqKiB5IGJham8gY29uZGljaW9uZXMgb3BlcmFjaW9uYWxlcywgZWNvbsOzbWljYXMgeSAqKnJlZ3VsYWNpb25lcyBndWJlcm5hbWVudGFsZXMgcHJldmFsZWNpZW50ZXMqKi4KCi0gKipRIE1vZGVsbyoqOiBTZSByZWZpZXJlIGEgbGEgZXN0aW1hY2nDs24gZGVsIHZvbHVtZW4gZGUgaGlkcm9jYXJidXJvcyByZWFsaXphZG8gcG9yIGVsICoqTW9kZWxvIGRlIFByb27Ds3N0aWNvIGRlIFByb2R1Y2Npw7NuKiouCgotICoqRVVSKio6IFZvbHVtZW4gZGUgcGV0csOzbGVvIGVzdGltYWRvIGEgc2VyIHJlY3VwZXJhZG8gYWwgZmluYWwgZGUgbGEgdmlkYSDDunRpbCBkZWwgY2FtcG8uIEVzdMOhIHJlbGFjaW9uYWRvIGNvbiBlbCB2b2x1bWVuIHByb2R1Y2lkbyB5IGxhcyByZXNlcnZhcyBwcm9iYWRhcy4gIEVuIGNpZXJ0YXMgb2Nhc2lvbmVzIGxvcyB0w6lybWlub3MgKipFVVIqKiB5ICoqUSBNb2RlbG8qKiBzb24gZXF1aXZhbGVudGVzLiAgCgotICoqVmVudGFuYSBkZWwgUHJvbsOzc3RpY28gZGUgUHJvZHVjY2nDs24qKjogVGllbXBvIGV4cHJlc2FkbyBlbiBtZXNlcywgdXNhZG8gcG9yIGVsIG1vZGVsbyBwYXJhIGNhbGN1bGFyIGVsIHByb27Ds3N0aWNvIGRlIHByb2R1Y2Npw7NuLCB0YW1iacOpbiBlcyB1dGlsaXphZG8gcGFyYSB2YWxpZGFyLCBsYSBlc3RpbWFjacOzbiBkZSBsYXMgKipyZXNlcnZhcyBwcm9iYWRhcyoqIGRlbCBjYW1wby4gCgotICoqVm9sdW1lbiBBZGljaW9uYWwgUHJvZHVjaWRvKio6IEVzIGVsIHZvbHVtZW4gcXVlIHJlc3VsdGEgYWwgYXBsaWNhciBsYSBWZW50YW5hIGRlbCBQcm9uw7NzdGljbyBkZSBQcm9kdWNjacOzbi4KCi0gKipUYXNhIGRlIFByb2R1Y2Npw7NuIGFsIEZpbmFsIGRlIGxhIFZlbnRhbmEgZGUgUHJvZHVjY2nDs24qKjogU2UgcmVmaWVyZSBhIGxhIHRhc2EgZGUgcHJvZHVjY2nDs24gZGVsIGNhbXBvLCBleHByZXNhZGFzIGVuIGJhcnJpbGVzIHBvciBkw61hIChiZCkgcXXDqSB0ZW5kcsOtYSBlbCBjYW1wbyB5IHF1ZSBoYSBzaWRvIGNhbGN1bGFkYSBhbCB1c2FyIGxhICAqKlZlbnRhbmEgZGVsIFByb27Ds3N0aWNvIGRlIFByb2R1Y2Npw7NuKiouCgojIFJlc3VsdGFkb3MgIAoKIyMgUmVzdW1lbiBQcm9kdWNjacOzbiAgCgpFbCBtb2RlbG8gdXRpbGl6YSBsYSBoaXN0b3JpYSBkZSBwcm9kdWNjacOzbiBkZSBsb3MgcG96b3MgZGVsIGNhbXBvLCByZXByZXNlbnRhZG8gcG9yIGVsICAqKnZvbHVtZW4gZGlhcmlvIGV4cHJlc2FkbyBlbiBtaWxlcyBiYXJyaWxlcyBwb3IgZMOtYSAobWJkKSoqIHByb2R1Y2lkbyBwb3IgbG9zIHBvem9zIGR1cmFudGUgdW4gbWVzLiAKCkEgcGFydGlyIGRlIGVzb3MgZGF0b3MsIGVsIG1vZGVsbyBjYWxjdWxhIGxhICoqcHJvZHVjY2nDs24gYWN1bXVsYWRhKiosIGdlbmVyYWxtZW50ZSBleHByZXNhZGFzIGVuICoqbWlsbG9uZXMgZGUgYmFycmlsZXMgKG1tYikqKi4KCkxhIHNpZ3VpZW50ZSBmaWd1cmEgbXVlc3RyYSBsYSBwcm9kdWNjacOzbiBhY3VtdWxhZGEgZGUgbG9zIHBvem9zIHByb2R1Y3RvcmVzIGRlbCBjYW1wby4gIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBlcnJvciBmbGFnCm5kIDwtICJubyBkYXRhIgoKIyBkaWdpdApkaWdpdCA9IDEKCiMgZmllbGQgbmFtZQpGaWVsZCA8LSAidGVycmEiCgojIGZvcmVjYXN0IHRpbWUgd2luZG93IChmY3cpCmZ0dyA9IDAKCiMgeWVhciB0byBmaWx0ZXIgcHJvdmVuIHJlc2VydmVzICh5ZnIpCnlmciA8LSAyMDEzCgojIGN1dG9mZiBRIHByb2R1Y3Rpb24gdmFsdWVzCmN1dG9mZiA8LSAwIAoKIyBjYXB0aW9ucyAKY2FwdDEgPC0gcGFzdGUoIkNhbXBvIiwgdG91cHBlcigiRXVsZXIiKSwgIi0gUHJvZHVjY2nDs24gZGUgUGV0csOzbGVvIikKY2FwdDIgPC0gCiAgcGFzdGUoIlZlbnRhbmEgZGVsIFByb27Ds3N0aWNvIGRlIFByb2R1Y2PDs246IiwgZnR3LCAibWVzZXMiKQoKIyBydW4gZGF0ZV9hY3R1YWxfcHJvZF9mdW4gZnVuY3Rpb24KZGFwIDwtIGRhdGVfYWN0dWFsX3Byb2RfZnVuKHdlbGxfcHJvZF9kYXRhJGRhdGUpCgojIHJ1biBhZGRfbW9udGhzX2Z1biBmdW5jdGlvbgpkZXAgPC0gYWRkX21vbnRoc19mdW4oZGFwLCBmdHcpCgojIHJ1biB3cmFwIHRyZWVtYXAgZnVuY3Rpb24Kd3JhcF90cmVlbWFwX2Z1bi4xKHdlbGxfcHJvZF9kYXRhLCBkYXApCmBgYApFbCDDoXJlYSBkZWwgcmVjdMOhbmd1bG8gcmVwcmVzZW50YSBhcHJveGltYWRhbWVudGUgZWwgdm9sdW1lbiBwcm9kdWNpZG8gcG9yIGVsIHBvem8gaW5kaWNhZG8uICAgCgojIyBIaXN0b3JpYSBkZSBQcm9kdWNjacOzbgoKTGEgc2lndWllbnRlIGZpZ3VyYSBtdWVzdHJhIGxhIGhpc3RvcmlhIGRlIHByb2R1Y2Npw7NuICoqcSAobWJkKSoqICB5IGxhIHByb2R1Y2Npw7NuIGFjdW11bGFkYSAqKlEgKG1tYikqKiBkZWwgY2FtcG8uICAgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBydW4gYnlmaWVsZF95bV9xX1FfZnVuCmZpZWxkX3dlbGxzX3Byb2QgPC0gYnlmaWVsZF95bV9xX1FfZnVuKHdlbGxfcHJvZF9kYXRhLCBGaWVsZCkKIyBjYXB0aW9ucyAKY2FwdDEgPC0gcGFzdGUoIkNhbXBvIiwgIkV1bGVyIiwgIi0gUHJvZHVjY2nDs24gZGUgUGV0csOzbGVvIikKYnlmaWVsZF95bV9xX1Ffc3VtX3Bsb3RfZnVuKGZpZWxkX3dlbGxzX3Byb2QpCmBgYAoKIyMgUHJlY2lzacOzbiBkZWwgTW9kZWxvCgpFbCBtb2RlbG8gdXRpbGl6YSBjb21vIGRhdG8gZGUgZW50cmFkYSwgbGEgcHJvZHVjY2nDs24gYWN1bXVsYWRhIHJlYWwgZGVsIGNhbXBvICoqUSAobW1iKSoqIHkgYSBwYXJ0aXIgZGUgYWxsw60sIGdlbmVyYSBjb21vIHJlc3VsdGFkbywgdW5hIGN1cnZhIGRlIHByb2R1Y2Npw7NuIGFjdW11bGFkYSBkZW5vbWluYWRhICoqUSBNb2RlbG8qKi4gICAgIAoKUGFyYSBsb3MgZWZlY3RvcyBkZSBkZXRlcm1pbmFyIGxhIHByZWNpc2nDs24gZGUgbGEgZXN0aW1hY2nDs24sIHNlIGNvbXBhcmEgZWwgdm9sdW1lbiBhY3VtdWxhZG8gKipRIChtbWIpKiogY29uIGVsIHZvbHVtZW4gY2FsY3VsYWRvIHBvciBlbCBtb2RlbG8gKipRIE1vZGVsbyAobW1iKSoqLiAgUGFyYSBlbGxvIHNlIHV0aWxpemEgdW4gdmFsb3IgbnVsbyBwYXJhIGxhICoqVmVudGFuYSBkZWwgUHJvbsOzc3RpY28gZGUgUHJvZHVjY2nDs24qKiwgZXN0byBzaWduaWZpY2EgcXVlIGVsIG1vZGVsbyByZWFsaXphcsOhIGxhIGVzdGltYWNpw7NuLCBhIGxhIGZlY2hhIGFjdHVhbCBkZSBsYSBoaXN0b3JpYSBkZSBwcm9kdWNjacOzbiBkZWwgY2FtcG8uICAKCkxhIHNpZ3VpZW50ZSBmaWd1cmEgbXVlc3RyYSBsb3MgcmVzdWx0YWRvcyBkZSBsYSBjb21wYXJhY2nDs246CgotIFByb2R1Y2Npw7NuIEFjdW11bGFkYS4gIAotIFEgTW9kZWxvLiAgCi0gRGlmZXJlbmNpYSBkZSBsb3MgVm9sw7ptZW5lcyBBbnRlcmlvcmVzLiAgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBydW4gd3JhcCBubHMgZnVuY3Rpb24KbmxzX291dCA8LSB3cmFwX25sc19mdW4od2VsbF9wcm9kX2RhdGEpCmJ5ZmllbGRfeW1fY3VtUSA8LSBubHNfb3V0W1sxXV0kYnlmaWVsZF95bV9jdW1RCm5sc19maXQgPC0gbmxzX291dFtbMl1dJG5sc19maXQKZmllbGRfd2VsbHNfcHJvZCA8LSBubHNfb3V0W1szXV0kZmllbGRfd2VsbHNfcHJvZAoKIyBydW4gd3JhcCBmb3JlY2FzdCBmdW5jdGlvbgpmb3JlY2FzdF9vdXQgPC0gd3JhcF9mb3JlY2FzdF9mdW4obmxzX2ZpdCwgYnlmaWVsZF95bV9jdW1RKQpmb3JlY2FzdF9RIDwtIGZvcmVjYXN0X291dFtbMV1dJGZvcmVjYXN0X1EKZm9yZWNhc3RfcSA8LSBmb3JlY2FzdF9vdXRbWzJdXSRmb3JlY2FzdF9xClRQRnRlIDwtIGZvcmVjYXN0X291dFtbM11dJFRQRnRlCmJ5ZmllbGRfeW1fcSA9IGZvcmVjYXN0X291dFtbNF1dJGJ5ZmllbGRfeW1fcQpwbG90X2xhYmVsID0gZm9yZWNhc3Rfb3V0W1s1XV0kcGxvdF9sYWJlbAoKIyBydW4gd3JhcCByZXNlcnZlcyBmdW5jdGlvbgpyZXN2X291dCA8LSB3cmFwX3Jlc2VydmVzX2Z1bihyZXNlcnZhcykKCm5tZSA8LSB0aWJibGUoCiAgY2FwID0gYygiUHJvZHVjY2nDs24gQWN1bXVsYWRhIENhbXBvIChtbWIpIiwgCiAgICAgICAgICAiUmVzZXJ2YXMgUHJvYmFkYXMgQ2FtcG8gKG1tYikiLAogICAgICAgICAgIkVVUiBPZmljaWFsIENhbXBvIChtbWIpIiwKICAgICAgICAgICJFVVIgTW9kZWxvIENhbXBvIChtbWIpIHVzYW5kbyBWZW50YW5hIFByb27Ds3N0aWNvIiwKICAgICAgICAgICJWb2x1bWVuIEFkaWNpb25hbCBQcm9kdWNpZG8gKG1tYikgdXNhbmRvIFZlbnRhbmEgUHJvbsOzc3RpY28iLAogICAgICAgICAgIlRhc2EgZGUgUHJvZHVjY2nDs24gYWwgRmluYWwgZGUgbGEgVmVudGFuYSBQcm9uw7NzdGljbyAobWJkKSIsCiAgICAgICAgICAiZGF0ZSBhY3R1YWwgcHJvZHVjdGlvbiIsIAogICAgICAgICAgImRhdGUgZXh0ZW5kZWQgcHJvZHVjdGlvbiIpLAogIG5tZSA9IGMoIlEiLCAiUi4xcCIsICJFVVJvIiwgIkVVUnAiLCAiVkFQdGUiLCAiVFBGdGUiLCAiZGFwIiwgImRlcCIpLAogIHVuaSA9IGMoIm1tYiIsICJtbWIiLCAibW1iIiwgIm1tYiIsICJtbWIiLCAibWJkIiwgTkEsIE5BKSwKICB2YWwgPSBjKG1heChmb3JlY2FzdF9xJFEsIG5hLnJtID0gVCksCiAgICAgICAgICByZXN2X291dFtbMl1dJGx5cHJbWzRdXSwKICAgICAgICAgIG1heChmb3JlY2FzdF9xJFEsIG5hLnJtID0gVCkgKyByZXN2X291dFtbMl1dJGx5cHJbWzRdXSwKICAgICAgICAgIG1heChmb3JlY2FzdF9RLCBuYS5ybSA9IFQpLCAKICAgICAgICAgIG1heChmb3JlY2FzdF9RLCBuYS5ybSA9IFQpIC0gbWF4KGZvcmVjYXN0X3EkUSwgbmEucm0gPSBUKSwKICAgICAgICAgIFRQRnRlJGZvcmVjYXN0X3EsCiAgICAgICAgICBkYXAsIAogICAgICAgICAgZGVwKSwKICBjb2wgPSBjKCIjYTFiYWU1IiwgIiNFODNDMTciLCAKICAgICAgICAgICIjNjVkNDZiIiwgIiNGRkMzMDAiLAogICAgICAgICAgIiNlYmI1NTgiLCAiI2UwYmE0NiIsCiAgICAgICAgICAiTkEiLCAiTkEiKSwKICBpY24gPSBjKCJmYS1yYW5kb20iKSkKCiMgcnVuIHBsb3RfbmxzX2Z1biBmdW5jdGlvbgpwbG90X25sc19mdW4uMShmb3JlY2FzdF9xLCBkZXApCmBgYAoKVW5hIGRpZmVyZW5jaWEgbXV5IGJhamEgZGUgbGEgcHJvZHVjY2nDs24gYWN1bXVsYWRhIHJlYWwgZGVsIGNhbXBvIHZzLiBlbCB2b2x1bWVuIGVzdGltYWRvIHBvciBlbCBtb2RlbG8sIGluZGljYXLDrWEgcXVlIGVsIG1vZGVsbyBlcyBiYXN0YW50ZSBwcmVjaXNvLiAgIAoKIyMgUHJvbsOzc3RpY28gVm9sdW1lbiBBZGljaW9uYWwgIAoKRWwgbW9kZWxvIHNlIHB1ZWRlIHV0aWxpemFyIHBhcmEgc2ltdWxhciBkaXZlcnNhcyBzaXR1YWNpb25lcy4gIEFsIGNhbWJpYXIgZWwgdmFsb3IgZGUgbGEgKipWZW50YW5hIGRlbCBQcm9uw7NzdGljbyBkZSBQcm9kdWNjacOzbioqIGEgdW4gbsO6bWVybyBhcmJpdHJhcmlvLCBjb21vIGVsIGluZGljYWRvIGVuIGxhIGZpZ3VyYSwgc2Ugb2J0aWVuZW4gbG9zIHJlc3VsdGFkb3MgbW9zdHJhZG9zIGEgY29udGludWFjacOzbjoKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgZm9yZWNhc3QgdGltZSB3aW5kb3cgKGZjdykKZnR3ID0gMTIwCgojIHJ1biBhZGRfbW9udGhzX2Z1biBmdW5jdGlvbgpkZXAgPC0gYWRkX21vbnRoc19mdW4oZGFwLCBmdHcpCgpjYXB0MiA8LSAKICBwYXN0ZSgiVmVudGFuYSBkZWwgUHJvbsOzc3RpY28gZGUgUHJvZHVjY8OzbjoiLCBmdHcsICJtZXNlcyIpCgojIHJ1biB3cmFwIG5scyBmdW5jdGlvbgpubHNfb3V0IDwtIHdyYXBfbmxzX2Z1bih3ZWxsX3Byb2RfZGF0YSkKYnlmaWVsZF95bV9jdW1RIDwtIG5sc19vdXRbWzFdXSRieWZpZWxkX3ltX2N1bVEKbmxzX2ZpdCA8LSBubHNfb3V0W1syXV0kbmxzX2ZpdApmaWVsZF93ZWxsc19wcm9kIDwtIG5sc19vdXRbWzNdXSRmaWVsZF93ZWxsc19wcm9kCgojIHJ1biB3cmFwIGZvcmVjYXN0IGZ1bmN0aW9uCmZvcmVjYXN0X291dCA8LSB3cmFwX2ZvcmVjYXN0X2Z1bihubHNfZml0LCBieWZpZWxkX3ltX2N1bVEpCmZvcmVjYXN0X1EgPC0gZm9yZWNhc3Rfb3V0W1sxXV0kZm9yZWNhc3RfUQpmb3JlY2FzdF9xIDwtIGZvcmVjYXN0X291dFtbMl1dJGZvcmVjYXN0X3EKVFBGdGUgPC0gZm9yZWNhc3Rfb3V0W1szXV0kVFBGdGUKYnlmaWVsZF95bV9xID0gZm9yZWNhc3Rfb3V0W1s0XV0kYnlmaWVsZF95bV9xCnBsb3RfbGFiZWwgPSBmb3JlY2FzdF9vdXRbWzVdXSRwbG90X2xhYmVsCgojIHJ1biB3cmFwIHJlc2VydmVzIGZ1bmN0aW9uCnJlc3Zfb3V0IDwtIHdyYXBfcmVzZXJ2ZXNfZnVuKHJlc2VydmFzKQoKbm1lIDwtIHRpYmJsZSgKICBjYXAgPSBjKCJQcm9kdWNjacOzbiBBY3VtdWxhZGEgQ2FtcG8gKG1tYikiLCAKICAgICAgICAgICJSZXNlcnZhcyBQcm9iYWRhcyBDYW1wbyAobW1iKSIsCiAgICAgICAgICAiRVVSIE9maWNpYWwgQ2FtcG8gKG1tYikiLAogICAgICAgICAgIkVVUiBNb2RlbG8gQ2FtcG8gKG1tYikgdXNhbmRvIFZlbnRhbmEgUHJvbsOzc3RpY28iLAogICAgICAgICAgIlZvbHVtZW4gQWRpY2lvbmFsIFByb2R1Y2lkbyAobW1iKSB1c2FuZG8gVmVudGFuYSBQcm9uw7NzdGljbyIsCiAgICAgICAgICAiVGFzYSBkZSBQcm9kdWNjacOzbiBhbCBGaW5hbCBkZSBsYSBWZW50YW5hIFByb27Ds3N0aWNvIChtYmQpIiwKICAgICAgICAgICJkYXRlIGFjdHVhbCBwcm9kdWN0aW9uIiwgCiAgICAgICAgICAiZGF0ZSBleHRlbmRlZCBwcm9kdWN0aW9uIiksCiAgbm1lID0gYygiUSIsICJSLjFwIiwgIkVVUm8iLCAiRVVScCIsICJWQVB0ZSIsICJUUEZ0ZSIsICJkYXAiLCAiZGVwIiksCiAgdW5pID0gYygibW1iIiwgIm1tYiIsICJtbWIiLCAibW1iIiwgIm1tYiIsICJtYmQiLCBOQSwgTkEpLAogIHZhbCA9IGMobWF4KGZvcmVjYXN0X3EkUSwgbmEucm0gPSBUKSwKICAgICAgICAgIHJlc3Zfb3V0W1syXV0kbHlwcltbNF1dLAogICAgICAgICAgbWF4KGZvcmVjYXN0X3EkUSwgbmEucm0gPSBUKSArIHJlc3Zfb3V0W1syXV0kbHlwcltbNF1dLAogICAgICAgICAgbWF4KGZvcmVjYXN0X1EsIG5hLnJtID0gVCksIAogICAgICAgICAgbWF4KGZvcmVjYXN0X1EsIG5hLnJtID0gVCkgLSBtYXgoZm9yZWNhc3RfcSRRLCBuYS5ybSA9IFQpLAogICAgICAgICAgVFBGdGUkZm9yZWNhc3RfcSwKICAgICAgICAgIGRhcCwgCiAgICAgICAgICBkZXApLAogIGNvbCA9IGMoIiNhMWJhZTUiLCAiI0U4M0MxNyIsIAogICAgICAgICAgIiM2NWQ0NmIiLCAiI0ZGQzMwMCIsCiAgICAgICAgICAiI2ViYjU1OCIsICIjZTBiYTQ2IiwKICAgICAgICAgICJOQSIsICJOQSIpLAogIGljbiA9IGMoImZhLXJhbmRvbSIpKQoKIyBydW4gcGxvdF9ubHNfZnVuIGZ1bmN0aW9uCnBsb3RfbmxzX2Z1bihmb3JlY2FzdF9xLCBkZXApCmBgYApFbCByZXN1bHRhZG8gYXNvY2lhZG8gYWwgKipQcm9uw7NzdGljbyBWb2x1bWVuIEFkaWNpb25hbCoqIHJlcHJlc2VudGEgZWwgdm9sdW1lbiBxdWUgZWwgbW9kZWxvIGVzdGltYSBxdWUgc2Vyw6EgcHJvZHVjaWRvIHBvciBlbCBjYW1wbywgZW4gdW5hIHZlbnRhbmEgZGVsIHByb27Ds3N0aWNvIGRlIHByb2R1Y2Npw7NuIGluZGljYWRvIGVuIGxhIGZpZ3VyYSBhbnRlcmlvci4KCiMjIFByb2R1Y2Npw7NuIERpYXJpYSB5IFRhc2EgZGUgUHJvZHVjY2nDs24gRmluYWwgRXN0aW1hZGEgIAoKRGUgbG9zIHJlc3VsdGFkb3MgZGVsIG1vZGVsbywgdGFtYmnDqW4gc2UgcHVlZGUgY2FsY3VsYXIgbGEgKipQcm9kdWNjacOzbiBEaWFyaWEgZGVsIE1vZGVsbyoqLCBhIHBhcnRpciBkZSBsYSBjdWFsLCBzZSBkZXRlcm1pbmEgbGEgKipUYXNhIGRlIFByb2R1Y2Npw7NuIGFsIEZpbmFsIGRlIGxhIFZlbnRhbmEgZGUgUHJvZHVjY2nDs24qKi4KCkVsIHZhbG9yIGRlIGVzYSB0YXNhIHBvZHLDrWEgZXN0YXIgcmVsYWNpb25hZG8gY29uIHZhcmlvcyBmYWN0b3JlcywgdGFsZXMgY29tbzoKCi0gTMOtbWl0ZSBlY29uw7NtaWNvIGRlbCBjYW1wby4gIAotIEdyYWRvIGRlIGFnb3RhbWllbnRvLiAgCi0gTml2ZWwgZGUgcmVzZXJ2YXMgcHJvYmFkYXMuICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgcnVuIHBsb3RfcSBmdW5jdGlvbgpwbG90X3EoZm9yZWNhc3RfcSkKYGBgCgojIyBDb21wYXJhY2nDs24gUmVzZXJ2YXMgUHJvYmFkYXMgeSBWb2x1bWVuIEFkaWNpb25hbCBQcm9kdWNpZG8gICAgCgpMYSBzaWd1aWVudGUgZmlndXJhIG11ZXN0cmEgbGEgaGlzdG9yaWEgZGUgbGEgZXZvbHVjacOzbiBkZSBsYSBlc3RpbWFjacOzbiBkZSByZXNlcnZhcyAocHJvYmFkYXMsIHByb2JhYmxlcyB5IHBvc2libGVzKSBkZWwgY2FtcG8uIAoKTG9zIHZvbMO6bWVuZXMgKipRIE1vZGVsbyoqIHF1ZSByZXN1bHRhbiBkZSBsYSB1dGlsaXphY2nDs24gZGVsIG1vZGVsbywgcHVlZGVuIHNlciBjb21wYXJhZG9zIGNvbiBsYXMgKipSZXNlcnZhcyBQcm9iYWRhcyoqIGRlbCBjYW1wby4gIERlYmlkbyBhIHF1ZSBjb25jZXB0dWFsbWVudGUgeSBiYWpvIGNpZXJ0YXMgY2lyY3Vuc3RhbmNpYXMsIGFtYmFzIGNhbnRpZGFkZXMgcG9kcsOtYW4gcmVwcmVzZW50YXIgYXByb3hpbWFkYW1lbnRlIGxvIG1pc21vLiAgIAoKRWwgbW9kZWxvIHB1ZWRlIHNlciB1dGlsaXphZG8gcGFyYSBjb21wcm9iYXIgbGEgZXN0aW1hY2nDs24gZGUgbGFzIHJlc2VydmFzIHByb2JhZGFzLCBlbGxvIHNlIHJlYWxpemEgbWVkaWFudGUgbGEgdXRpbGl6YWNpw7NuIGRlIHZhbG9yZXMgYXByb3BpYWRvcyBkZSBsYSAqKlZlbnRhbmEgZGVsIFByb27Ds3N0aWNvIGRlIFByb2R1Y2Npw7NuKiogcGFyYSBnZW5lcmFyIGVsICoqVm9sdW1lbiBBZGljaW9uYWwgUHJvZHVjaWRvKiosIMOpc3RlIMO6bHRpbW8gYWwgc2VyIGNvbXBhcmFkbyBjb24gbGFzICoqUmVzZXJ2YXMgUHJvYmFkYXMqKiBwZXJtaXRlIGNvdGVqYXIgcXXDqSB0YW4gKipyYXpvbmFibGUqKiBlcyBlbCB2b2x1bWVuIGVzdGltYWRvIGRlIHJlc2VydmFzIHByb2JhZGFzIG9maWNpYWxlcyBkZWwgY2FtcG8uCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIHJ1biBwbG90X2ZpZWxkX3Jlc2VydmVzX2Z1biBmdW5jdGlvbgpGaWVsZCA8LSAiRXVsZXIiCnBsb3RfZmllbGRfcmVzZXJ2ZXNfZnVuKHJlc3Zfb3V0W1sxXV0kZmllbGRfcmVzZXJ2ZXNfc3VtKQpgYGAKCiMgRXZhbHVhY2nDs24gRWNvbsOzbWljYSAgCgpMYSBldmFsdWFjacOzbiBlY29uw7NtaWNhIGRlbCBjYW1wbyBkZXBlbmRlIGRlIHVuYSB2YXJpZWRhZCBkZSBmYWN0b3JlcyBxdWUgZXN0w6FuIHJlbGFjaW9uYWRvcyBjb246IGkpIGVsIHByZWNpbyBkZSBsb3MgaGlkcm9jYXJidXJvcyBwcm9kdWNpZG9zOyBpaSkgbG9zIGNvc3RvcyBhc29jaWFkb3MgYSBsYXMgaW52ZXJzaW9uZXMgeSBnYXN0b3Mgb3BlcmF0aXZvczsgaWlpKSAqKnJlZ3VsYWNpb25lcyBndWJlcm5hbWVudGFsZXMgcHJldmFsZWNpZW50ZXMqKiwgZW50cmUgb3Ryb3MuCgpQYXJhIGxvcyBlZmVjdG9zIGRlbCBtb2RlbG8gZGUgcHJvbsOzc3RpY28gZGUgcHJvZHVjY2nDs24gc2UgdXRpbGl6YSB1bmEgKipldmFsdWFjacOzbiBlY29uw7NtaWNhIHNpbXBsaWZpY2FkYSoqLCBxdWUgY29uc2lzdGUgZW4gZW1wbGVhciBzb2xhbWVudGUgcHJlY2lvcywgZ2FzdG9zIG9wZXJhdGl2b3MsIHRhc2EgZGUgZGVzY3VlbnRvIHkgZWwgdm9sdW1lbiBhZGljaW9uYWwgZXN0aW1hZG8gcG9yIGVsIG1vZGVsbyBjb25zaWRlcmFuZG8gdW5hIHZlbnRhbmEgZGUgcHJvbsOzc3RpY28gZGUgcHJvZHVjY2nDs24gZXNwZWPDrWZpY2EuCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjYXB0MSA8LSBwYXN0ZSgiQ2FtcG8iLCB0b3VwcGVyKEZpZWxkKSwgIi0gRXZhbHVhY2nDs24gRWNvbsOzbWljYSIpCiMgb2lsIHByaWNlCnByaWNlID0gMjAKIyBvcGV4IHZhciB1c2QvYgpvcGV4X3ZhciA9IDE1CiMgb3BleCBmaXggbW11c2QvbW9udGhzCm9wZXhfZml4ID0gLjI1CiMgYW5udWFsX2Rpc2NvdW50X2ZhY3RvcgphZHIgPC0gMC4xCiMgZGlzY291bnQgZmFjdG9yIApkZnIgPSAoMSArIGFkcikgXiAoMS8xMikgLSAxCgpkYXRhIDwtIHRpYmJsZShWYXJpYWJsZSA9IGMoIlRhc2EgZGUgZGVzY3VlbnRvIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlY2lvIHBldHLDs2xlbyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9wZXggdmFyaWFibGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcGV4IGZpam8iKSwKICAgICAgICAgICAgICAgVmFsb3IgPSBjKDAuMSwgMjAsIDE1LCAwLjI1KSwKICAgICAgICAgICAgICAgVW5pZGFkZXMgPSBjKCIlIGRlY2ltYWwiLCAidXNkL2JhcnJpbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZC9iYXJyaWwiLCAibW11c2QvbWVzIikpCgpkZiA8LSBmb3JlY2FzdF9xICU+JSAKICBmaWx0ZXIoaXMubmEocSkpICU+JQogIHNlbGVjdChmb3JlY2FzdF9xKSAlPiUKICByZW5hbWUocSA9IGZvcmVjYXN0X3EpICU+JQogIG11dGF0ZSh0ID0gMTpuKCksIAogICAgICAgICBxX21tYiA9IDMwLjQ1ICogcSAvIDEwMDAsICMgcSBtbWJkIHBlciBtb250aHMKICAgICAgICAgUV9tbWIgPSBjdW1zdW0ocV9tbWIpLCAKICAgICAgICAgaW5jb21lX21tdXNkID0gcHJpY2UgKiBxX21tYiwgIyBtbXVzZCBwZXIgbW9udGhzCiAgICAgICAgIG9wZXhfZml4X21tdXNkLmJ5Lm1vbnRocyA9IG9wZXhfZml4LCAjIG1tdXNkIHBlciBtb250aHMKICAgICAgICAgb3BleF92YXJfbW11c2QgPSBxX21tYiAqIG9wZXhfdmFyLCAjIG1tdXNkIHBlciBtb250aHMKICAgICAgICAgb3BleF90b3RfbW11c2QgPSBvcGV4X2ZpeF9tbXVzZC5ieS5tb250aHMgKyAKICAgICAgICAgICBvcGV4X3Zhcl9tbXVzZCwgIyBvcGV4X21tdXNkICAKICAgICAgICAgZGZyID0gKDEgKyBhZHIpIF4gKDEvMTIpIC0gMSwKICAgICAgICAgZHNjZiA9IDEgLyAoMSArIGRmcikgXiB0LAogICAgICAgICBjZiA9IGluY29tZV9tbXVzZCAtIG9wZXhfdG90X21tdXNkLCAgICAgICAgIAogICAgICAgICBkY2YgPSBjZiAqIGRzY2YsCiAgICAgICAgIFZQTiA9IGN1bXN1bShkY2YpKSAlPiUKICBzZWxlY3QodCwgVlBOLCBxLCBRX21tYikKYGBgCgojIyBWYWxvcmVzIFV0aWxpemFkb3MKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdGEKYGBgCgojIyBSZXN1bHRhZG9zIEV2YWx1YWNpw7NuIEVjb27Ds21pY2EKCkVsIHNpZ3VpZW50ZSBncsOhZmljbyBtdWVzdHJhIGxvcyByZXN1bHRhZG9zIGZpbmFsZXMgZGUgbGFzIGVzdGltYWNpb25lczoKCi0gUHJvZHVjY2nDs24gQWN1bXVsYWRhIGRlbCBjYW1wbyAobW1iKQotIFJlc2VydmFzIFByb2JhZGFzIE9maWNpYWxlcyAobW1iKS4KLSBQcm9uw7NzdGljbyBkZWwgVm9sdW1lbiBBZGljaW9uYWwgRXN0aW1hZG8gcG9yIGVsIE1vZGVsbyAobW1iKS4KLSBUYXNhIGRlIFByb2R1Y2Npw7NuIGFsIEZpbmFsIGRlIGxhIFZlbnRhbmEgUHJvbsOzc3RpY28gKG1iZCkuCi0gVmFsb3IgUHJlc2VudGUgTmV0byAobW11c2QpLgoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZWNvbm9taWNfcmVzdWx0c19wbG90X2Z1bihkZikKYGBgCgpgYGB7ciBldmFsPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIENvbmZpZGVuY2UgSW50ZXJ2YWxzIApjaV9wbG90X2Z1bihubHNfZml0LCBmb3JlY2FzdF9xJHQsIGZvcmVjYXN0X3EkUSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KZW5kX3RpbWUgPC0gU3lzLnRpbWUoKQplbmRfdGltZSAtIHN0YXJ0X3RpbWUKYGBgCgoK