Con R puedes realizar operaciones aritméticas básicas como las siguientes: * Suma: + * Substracción: - - Multiplicación: * - División: /

Por ejemplo, en la siguiente línea, suma 7 + 3

 7 + 3

Una ventaja de usar un lenguaje de programación es que se pueden asignar variables y usarlas en las operaciones aritméticas, veamos algunos ejemplos:

Creación de variables

Una manera muy cómoda de manejar un “conjunto de datos” es generar variables que contengan nuestros datos. Para lo cual usamos un comando de asignación <- de valores o caracteres, a variables, como en el ejemplo siguiente:

mi.variable <- 42
manzanas <- 5
naranjas <- 7

mi.fruta <- manzanas + naranjas

R trabaja con varios tipos de datos:

  • Valores decimales como 4.5 son llamados numéricos.
  • Los números naturales como el 4 son llamados enteros, los cuales también son numéricos.
  • Los valores booleanos (TRUE or FALSE) son llamados lógicos.
  • Text (o string) son llamados caracteres.

Para conocer qué tipo o clase de datos son los valores de tus datos puedes usar el comando “class(datos)”

letras <- "conjunto de caracteres"
class(letras)

Vectores

Arreglo de una dimensión de numeros, enteros o caracteres, c() - combinar o concatenar

vector.numerico <- c(1, 10, 49)
vector.caracteres <- c("a", "b", "c")

NOTA: para determinar a los caracteres debes usar doble-comillas para determinar esa clase de datos, e.g. “caracter”

El siguiente código no genera un vector booleano rm principio porque los valores estan entre parentesis, ademas utiliza valores TRUE / FALSE que R no reconoce, R solo reconoce TRUE, T, FALSE y F.

vector.booleano <- c("T", "TRUE", "True", "true", "F", "FALSE", "False", "false")

Ejercicio “imaginario”

Supongamos que te fuiste de vacaciones a Las Vegas por una semana. Una vez que regresas a México y revisas tu cuenta bancaria, decides calcular tus ganancias y pérdidas en los casinos y para ello usarás tus super-poderes en R.

Primero, revisas las ganancias y pérdidas de los tickets que te han mandado los casinos por cada día y por cada uno de los juegos que practicaste en esa semana. Con estos datos vas a generar los vectores que consideres necesarios. Para empezar te sugerimos empezar con dos: uno para cada tipo de juego.

Para vector.poker: El lunes ganaste $140 El martes perdiste $50 El miércoles ganaste $20 El jueves perdiste $120 El viernes ganaste $240

Para vector.ruleta: El lunes perdiste $24 El martes perdiste $50 El miércoles ganaste $100 El jueves perdiste $350 El viernes ganaste $10

vector.poker <- c(140, -50, 20, -120, 240)
vector.ruleta <- c(-24, -50, 100, -350, 10)

También puedes asignar los nombres de los días a los que corresponden las ganacias y las pérdiadas

names(vector.poker) <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
names(vector.ruleta) <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")

o bien:

vector.dias <-  c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
names(vector.poker) <- vector.dias
names(vector.ruleta) <- vector.dias

Para calcular la ganacia por semana vamos a sumar los las ganancias-pérdidas de cada juego. Después vas a sumar las ganancias-pérdidas de los dos juegos.

¿Crees que eres mejor en el poker que en la ruleta?

total.poker <- sum(vector.poker)
total.ruleta <-  sum(vector.ruleta)

total.semana <- total.poker + total.ruleta
total.poker > total.ruleta

Ahora, resta las ganancias-pérdidas del poker al total de la semana, para conocer las ganancias-pérdidas de la ruleta.

total.semana - total.poker

Para seleccionar los elementos de un vector (tambien para matrices y data frames), puedes usar las parentesis cuadrados []. Entre los parentesis cuadrados, indica que elementos quieres seleccionar. Por ejemplo, para seleccionar el primer elemento, coloca el número 1 entre los parentesis cuadrados. i.e. [1].

Selecciona el valor de ganacia o pérdida del miércoles en la ruleta

vector.ruleta[3]

Selecciona las ganacias-pérdidas de los días del martes al jueves del poker y con esos datos constuye una variable llamada “poker.media.semana”.

poker.media.semana <- vector.poker[c(2:4)]

Comparaciones

Para comparar entre ganacias y pérdidas en toda la semana, o entre tipos de juegos (poker vs ruleta) puedes usar los operadores booleanos.

Los operadores para comparisones (lógicas) en R son:

  • para menor que: <
  • para mayor que: >
  • para menor que o igual a: <=
  • para mayor que o igual a: >=
  • para gual a: ==
  • no igual a: !=

6 > 5 dará como resultado TRUE. En R este tipo de comparasiones se pueden hacer por vectores completos.

Para saber qué días ganaste en el poker, primero hay que seleccionar aquellos días con ganancias con operdores booleanos.

poker.seleccion <- vector.poker > 0
poker.dias.ganancias <- vector.poker[poker.seleccion]

Las ganancias-péridas que has calculado están en nominación de dolares. Calcula tus ganancias por cada día y por cada juego en pesos mexicanos (utiliza una multiplicación).

Calcula tus ganacias o pérdidas totales en pesos mexicanos (vamos a supones que cada dolar equilvale a 20 pesos mexicanos)

vector.poker * 20
vector.ruleta * 20

Debes pagar al banco toda la deuda en un mes (30 días), pagando la misma cantidad cada día. Cuánto debes pagar cada día al banco? (utiliza una division, por lo menos).

(total.semana * 20) / 30

De no pagar la deuda en ese periodo, tendras que pagar el triple por cada día no pagado. Desgraciadamente, habrá 3 días en los que no podrás pagar. Calcula cuando tendrás que pagar por esos días que no cumpliste con el pago.

dia.pago <- (total.semana * 20) / 30
dia.pago * 3

Para pagar los “impuestos” vas a usar la tanda de la familia que son $2,000. Una vez que pagues los impuestos, cuánto te va a sobrar de la tanda?

tanda <- 2000
tanda - abs(total.semana * 20)

Otros comandos últiles para aritmética

  • Elevar a la potencia: ^ operación matemática entre dos términos denominados: base a y exponente n. Se escribe an y se lee usualmente como «a elevado a n» o también «a elevado a la n».
56 ^ 2
  • Módulo: %% Lo que sobra al dividir 2000 entre 56
2000 %% 56
  • División entera: se devuelve la parte entera solamente Revisar la division entera y el módulo juntos
2000 / 56 # division real
2000 %/% 56 # division entera
  • Raíz cuadrada: es un número que al ser multiplicado por sí mismo, da como resultado el número inicial.
sqrt(2)
  • Exponentes: el exponente nos dice cuántas veces se usa el número en una multiplicación. exponente del numero e que es un número imaginario (2,71828).
exp(1)
  • El logaritmo neperiano de (número), aveces llamado natural, pero no es lo mismo. El logaritmo natural usea el numero e.
log(3)
  • El logaritmo de 3 en base 10
log(3, 10)
  • pi = es la relación entre el perímetro de una circunferencia y la longitud de su diámetro.
pi

Bueno, con estos ejercicios se espera que queden claros algunos comandos básicos de R, así como las bases de la sintaxis de este lenguaje y que no es “un bueno negocio” jugar en las Vegas.

LS0tCnRpdGxlOiAiQXJpdG1ldGljYSBlbiBSIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgICB0aGVtZTogc2FuZHN0b25lCiAgICBpbmNsdWRlOgogICAgICBhZnRlcl9ib2R5OiBkaXNxdXNfaW5zZXJ0Lmh0bWwKICAgIGNzczogY3VzdG9tLmNzcwotLS0KCkNvbiBSIHB1ZWRlcyByZWFsaXphciBvcGVyYWNpb25lcyBhcml0bcOpdGljYXMgYsOhc2ljYXMgY29tbyBsYXMgc2lndWllbnRlczogCiogU3VtYTogKwoqIFN1YnN0cmFjY2nDs246IC0KLSBNdWx0aXBsaWNhY2nDs246ICoKLSBEaXZpc2nDs246IC8KClBvciBlamVtcGxvLCBlbiBsYSBzaWd1aWVudGUgbMOtbmVhLCBzdW1hIDcgKyAzIApgYGB7cn0KIDcgKyAzCmBgYAoKVW5hIHZlbnRhamEgZGUgdXNhciB1biBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuIGVzIHF1ZSBzZSBwdWVkZW4gYXNpZ25hciB2YXJpYWJsZXMgeSB1c2FybGFzIGVuIGxhcyBvcGVyYWNpb25lcyBhcml0bcOpdGljYXMsCnZlYW1vcyBhbGd1bm9zIGVqZW1wbG9zOgoKIyMgQ3JlYWNpw7NuIGRlIHZhcmlhYmxlcwoKVW5hIG1hbmVyYSBtdXkgY8OzbW9kYSBkZSBtYW5lamFyIHVuICJjb25qdW50byBkZSBkYXRvcyIgZXMgZ2VuZXJhciB2YXJpYWJsZXMgcXVlIGNvbnRlbmdhbiBudWVzdHJvcyBkYXRvcy4gUGFyYSBsbyBjdWFsIAp1c2Ftb3MgdW4gY29tYW5kbyBkZSAqKmFzaWduYWNpw7NuKiogYDwtYCBkZSB2YWxvcmVzIG8gY2FyYWN0ZXJlcywgYSB2YXJpYWJsZXMsIGNvbW8gZW4gZWwgZWplbXBsbyBzaWd1aWVudGU6CgpgYGB7cn0KbWkudmFyaWFibGUgPC0gNDIKbWFuemFuYXMgPC0gNQpuYXJhbmphcyA8LSA3CgptaS5mcnV0YSA8LSBtYW56YW5hcyArIG5hcmFuamFzCmBgYAoKUiB0cmFiYWphIGNvbiB2YXJpb3MgdGlwb3MgZGUgZGF0b3M6CgotIFZhbG9yZXMgZGVjaW1hbGVzIGNvbW8gNC41IHNvbiBsbGFtYWRvcyAqbnVtw6lyaWNvcyouCi0gTG9zIG7Dum1lcm9zIG5hdHVyYWxlcyBjb21vIGVsIDQgc29uIGxsYW1hZG9zICplbnRlcm9zKiwgbG9zIGN1YWxlcyB0YW1iacOpbiBzb24gbnVtw6lyaWNvcy4gCi0gTG9zIHZhbG9yZXMgYm9vbGVhbm9zIChUUlVFIG9yIEZBTFNFKSBzb24gbGxhbWFkb3MgKmzDs2dpY29zKi4KLSBUZXh0IChvIHN0cmluZykgc29uIGxsYW1hZG9zICpjYXJhY3RlcmVzKi4KClBhcmEgY29ub2NlciBxdcOpIHRpcG8gbyBjbGFzZSBkZSBkYXRvcyBzb24gbG9zIHZhbG9yZXMgZGUgdHVzIGRhdG9zIHB1ZWRlcyB1c2FyIGVsIGNvbWFuZG8gImNsYXNzKGRhdG9zKSIKCmBgYHtyfQpsZXRyYXMgPC0gImNvbmp1bnRvIGRlIGNhcmFjdGVyZXMiCmNsYXNzKGxldHJhcykKYGBgCgojIFZlY3RvcmVzCgpBcnJlZ2xvIGRlIHVuYSBkaW1lbnNpw7NuIGRlIG51bWVyb3MsIGVudGVyb3MgbyBjYXJhY3RlcmVzLCBgYygpYCAtIGNvbWJpbmFyIG8gY29uY2F0ZW5hciAKCmBgYHtyfQp2ZWN0b3IubnVtZXJpY28gPC0gYygxLCAxMCwgNDkpCnZlY3Rvci5jYXJhY3RlcmVzIDwtIGMoImEiLCAiYiIsICJjIikKYGBgCj4gTk9UQTogcGFyYSBkZXRlcm1pbmFyIGEgbG9zIGNhcmFjdGVyZXMgZGViZXMgdXNhciBkb2JsZS1jb21pbGxhcyBwYXJhIGRldGVybWluYXIgZXNhIGNsYXNlIGRlIGRhdG9zLCBlLmcuICJjYXJhY3RlciIKCkVsIHNpZ3VpZW50ZSBjw7NkaWdvIG5vIGdlbmVyYSB1biB2ZWN0b3IgYm9vbGVhbm8gcm0gcHJpbmNpcGlvIHBvcnF1ZSBsb3MgdmFsb3JlcyBlc3RhbiBlbnRyZSBwYXJlbnRlc2lzLCBhZGVtYXMgdXRpbGl6YSB2YWxvcmVzClRSVUUgLyBGQUxTRSBxdWUgUiBubyByZWNvbm9jZSwgUiBzb2xvIHJlY29ub2NlIGBUUlVFYCwgYFRgLCBgRkFMU0VgIHkgYEZgLiAKCmBgYHtyfQp2ZWN0b3IuYm9vbGVhbm8gPC0gYygiVCIsICJUUlVFIiwgIlRydWUiLCAidHJ1ZSIsICJGIiwgIkZBTFNFIiwgIkZhbHNlIiwgImZhbHNlIikKYGBgCgoKIyMgRWplcmNpY2lvICJpbWFnaW5hcmlvIgoKU3Vwb25nYW1vcyBxdWUgdGUgZnVpc3RlIGRlIHZhY2FjaW9uZXMgYSBMYXMgVmVnYXMgcG9yIHVuYSBzZW1hbmEuIFVuYSB2ZXogcXVlIHJlZ3Jlc2FzIGEgTcOpeGljbyB5IHJldmlzYXMgdHUgY3VlbnRhIApiYW5jYXJpYSwgZGVjaWRlcyBjYWxjdWxhciB0dXMgZ2FuYW5jaWFzIHkgcMOpcmRpZGFzIGVuIGxvcyBjYXNpbm9zIHkgcGFyYSBlbGxvIHVzYXLDoXMgdHVzIHN1cGVyLXBvZGVyZXMgZW4gUi4KClByaW1lcm8sIHJldmlzYXMgbGFzIGdhbmFuY2lhcyB5IHDDqXJkaWRhcyBkZSBsb3MgdGlja2V0cyBxdWUgdGUgaGFuIG1hbmRhZG8gbG9zIGNhc2lub3MgcG9yIGNhZGEgZMOtYSB5IHBvciBjYWRhIHVubyBkZSAKbG9zIGp1ZWdvcyBxdWUgcHJhY3RpY2FzdGUgZW4gZXNhIHNlbWFuYS4KQ29uIGVzdG9zIGRhdG9zIHZhcyBhIGdlbmVyYXIgbG9zIHZlY3RvcmVzIHF1ZSBjb25zaWRlcmVzIG5lY2VzYXJpb3MuIFBhcmEgZW1wZXphciB0ZSBzdWdlcmltb3MgZW1wZXphciBjb24gZG9zOiB1bm8gCnBhcmEgY2FkYSB0aXBvIGRlIGp1ZWdvLgoKUGFyYSB2ZWN0b3IucG9rZXI6CkVsIGx1bmVzIGdhbmFzdGUgJDE0MApFbCBtYXJ0ZXMgcGVyZGlzdGUgJDUwCkVsIG1pw6lyY29sZXMgZ2FuYXN0ZSAkMjAKRWwganVldmVzIHBlcmRpc3RlICQxMjAKRWwgdmllcm5lcyBnYW5hc3RlICQyNDAKClBhcmEgdmVjdG9yLnJ1bGV0YToKRWwgbHVuZXMgcGVyZGlzdGUgJDI0CkVsIG1hcnRlcyBwZXJkaXN0ZSAkNTAKRWwgbWnDqXJjb2xlcyBnYW5hc3RlICQxMDAKRWwganVldmVzIHBlcmRpc3RlICQzNTAKRWwgdmllcm5lcyBnYW5hc3RlICQxMAoKYGBge3J9CnZlY3Rvci5wb2tlciA8LSBjKDE0MCwgLTUwLCAyMCwgLTEyMCwgMjQwKQp2ZWN0b3IucnVsZXRhIDwtIGMoLTI0LCAtNTAsIDEwMCwgLTM1MCwgMTApCmBgYAoKClRhbWJpw6luIHB1ZWRlcyBhc2lnbmFyIGxvcyBub21icmVzIGRlIGxvcyBkw61hcyBhIGxvcyBxdWUgY29ycmVzcG9uZGVuIGxhcyBnYW5hY2lhcyB5IGxhcyBww6lyZGlhZGFzCgpgYGB7cn0KbmFtZXModmVjdG9yLnBva2VyKSA8LSBjKCJMdW5lcyIsICJNYXJ0ZXMiLCAiTWnDqXJjb2xlcyIsICJKdWV2ZXMiLCAiVmllcm5lcyIpCm5hbWVzKHZlY3Rvci5ydWxldGEpIDwtIGMoIkx1bmVzIiwgIk1hcnRlcyIsICJNacOpcmNvbGVzIiwgIkp1ZXZlcyIsICJWaWVybmVzIikKYGBgCgpvIGJpZW46CgpgYGB7cn0KdmVjdG9yLmRpYXMgPC0gIGMoIkx1bmVzIiwgIk1hcnRlcyIsICJNacOpcmNvbGVzIiwgIkp1ZXZlcyIsICJWaWVybmVzIikKbmFtZXModmVjdG9yLnBva2VyKSA8LSB2ZWN0b3IuZGlhcwpuYW1lcyh2ZWN0b3IucnVsZXRhKSA8LSB2ZWN0b3IuZGlhcwpgYGAKClBhcmEgY2FsY3VsYXIgbGEgZ2FuYWNpYSBwb3Igc2VtYW5hIHZhbW9zIGEgc3VtYXIgbG9zIGxhcyBnYW5hbmNpYXMtcMOpcmRpZGFzIGRlIGNhZGEganVlZ28uCkRlc3B1w6lzIHZhcyBhICpzdW1hciogbGFzIGdhbmFuY2lhcy1ww6lyZGlkYXMgZGUgbG9zIGRvcyBqdWVnb3MuCgrCv0NyZWVzIHF1ZSBlcmVzIG1lam9yIGVuIGVsIHBva2VyIHF1ZSBlbiBsYSBydWxldGE/CgpgYGB7cn0KdG90YWwucG9rZXIgPC0gc3VtKHZlY3Rvci5wb2tlcikKdG90YWwucnVsZXRhIDwtICBzdW0odmVjdG9yLnJ1bGV0YSkKCnRvdGFsLnNlbWFuYSA8LSB0b3RhbC5wb2tlciArIHRvdGFsLnJ1bGV0YQp0b3RhbC5wb2tlciA+IHRvdGFsLnJ1bGV0YQpgYGAKCkFob3JhLCByZXN0YSBsYXMgZ2FuYW5jaWFzLXDDqXJkaWRhcyBkZWwgcG9rZXIgYWwgdG90YWwgZGUgbGEgc2VtYW5hLCBwYXJhIGNvbm9jZXIgbGFzICBnYW5hbmNpYXMtcMOpcmRpZGFzIGRlIGxhIHJ1bGV0YS4KCmBgYHtyfQp0b3RhbC5zZW1hbmEgLSB0b3RhbC5wb2tlcgpgYGAKCgpQYXJhIHNlbGVjY2lvbmFyIGxvcyBlbGVtZW50b3MgZGUgdW4gdmVjdG9yICh0YW1iaWVuIHBhcmEgbWF0cmljZXMgeSBkYXRhIGZyYW1lcyksIHB1ZWRlcyB1c2FyIGxhcyBwYXJlbnRlc2lzIGN1YWRyYWRvcwpgW11gLiBFbnRyZSBsb3MgcGFyZW50ZXNpcyBjdWFkcmFkb3MsIGluZGljYSBxdWUgZWxlbWVudG9zIHF1aWVyZXMgc2VsZWNjaW9uYXIuIFBvciBlamVtcGxvLCBwYXJhIHNlbGVjY2lvbmFyIGVsIHByaW1lcgplbGVtZW50bywgY29sb2NhIGVsIG7Dum1lcm8gMSBlbnRyZSBsb3MgcGFyZW50ZXNpcyBjdWFkcmFkb3MuIGkuZS4gYFsxXWAuCgpTZWxlY2Npb25hIGVsIHZhbG9yIGRlIGdhbmFjaWEgbyBww6lyZGlkYSBkZWwgbWnDqXJjb2xlcyBlbiBsYSBydWxldGEgCmBgYHtyfQp2ZWN0b3IucnVsZXRhWzNdCgpgYGAKClNlbGVjY2lvbmEgbGFzIGdhbmFjaWFzLXDDqXJkaWRhcyBkZSBsb3MgZMOtYXMgZGVsIG1hcnRlcyBhbCBqdWV2ZXMgZGVsIHBva2VyIHkgY29uIGVzb3MgZGF0b3MgY29uc3R1eWUgdW5hIHZhcmlhYmxlIApsbGFtYWRhICJwb2tlci5tZWRpYS5zZW1hbmEiLgoKYGBge3J9CnBva2VyLm1lZGlhLnNlbWFuYSA8LSB2ZWN0b3IucG9rZXJbYygyOjQpXQpgYGAKCgojIyBDb21wYXJhY2lvbmVzIApQYXJhIGNvbXBhcmFyIGVudHJlIGdhbmFjaWFzIHkgcMOpcmRpZGFzIGVuIHRvZGEgbGEgc2VtYW5hLCBvIGVudHJlIHRpcG9zIGRlIGp1ZWdvcyAocG9rZXIgdnMgcnVsZXRhKSBwdWVkZXMgdXNhciAKbG9zIG9wZXJhZG9yZXMgYm9vbGVhbm9zLiAgCgpMb3Mgb3BlcmFkb3JlcyBwYXJhIGNvbXBhcmlzb25lcyAobMOzZ2ljYXMpIGVuIFIgc29uOgoKLSBwYXJhIG1lbm9yIHF1ZTogPAotIHBhcmEgbWF5b3IgcXVlOiA+Ci0gcGFyYSBtZW5vciBxdWUgbyBpZ3VhbCBhOiA8PQotIHBhcmEgbWF5b3IgcXVlIG8gaWd1YWwgYTogPj0KLSBwYXJhIGd1YWwgYTogPT0KLSBubyBpZ3VhbCBhOiAhPQoKNiA+IDUgZGFyw6EgY29tbyByZXN1bHRhZG8gVFJVRS4gRW4gUiBlc3RlIHRpcG8gZGUgY29tcGFyYXNpb25lcyBzZSBwdWVkZW4gaGFjZXIgcG9yIHZlY3RvcmVzIGNvbXBsZXRvcy4KClBhcmEgc2FiZXIgcXXDqSBkw61hcyBnYW5hc3RlIGVuIGVsIHBva2VyLCBwcmltZXJvIGhheSBxdWUgc2VsZWNjaW9uYXIgYXF1ZWxsb3MgZMOtYXMgY29uIGdhbmFuY2lhcyBjb24gb3BlcmRvcmVzIGJvb2xlYW5vcy4gCgpgYGB7cn0KcG9rZXIuc2VsZWNjaW9uIDwtIHZlY3Rvci5wb2tlciA+IDAKcG9rZXIuZGlhcy5nYW5hbmNpYXMgPC0gdmVjdG9yLnBva2VyW3Bva2VyLnNlbGVjY2lvbl0KYGBgCgpMYXMgZ2FuYW5jaWFzLXDDqXJpZGFzIHF1ZSBoYXMgY2FsY3VsYWRvIGVzdMOhbiBlbiBub21pbmFjacOzbiBkZSBkb2xhcmVzLiBDYWxjdWxhIHR1cyBnYW5hbmNpYXMgcG9yIGNhZGEgZMOtYSB5IHBvciBjYWRhCmp1ZWdvIGVuIHBlc29zIG1leGljYW5vcyAodXRpbGl6YSB1bmEgbXVsdGlwbGljYWNpw7NuKS4KCkNhbGN1bGEgdHVzIGdhbmFjaWFzIG8gcMOpcmRpZGFzIHRvdGFsZXMgZW4gcGVzb3MgbWV4aWNhbm9zICh2YW1vcyBhIHN1cG9uZXMgcXVlIGNhZGEgZG9sYXIgZXF1aWx2YWxlIGEgMjAgcGVzb3MgbWV4aWNhbm9zKQoKYGBge3J9CnZlY3Rvci5wb2tlciAqIDIwCnZlY3Rvci5ydWxldGEgKiAyMApgYGAKCgpEZWJlcyBwYWdhciBhbCBiYW5jbyB0b2RhIGxhIGRldWRhIGVuIHVuIG1lcyAoMzAgZMOtYXMpLCBwYWdhbmRvIGxhIG1pc21hIGNhbnRpZGFkIGNhZGEgZMOtYS4gQ3XDoW50byBkZWJlcyBwYWdhciBjYWRhIGTDrWEKYWwgYmFuY28/ICh1dGlsaXphIHVuYSBkaXZpc2lvbiwgcG9yIGxvIG1lbm9zKS4KCmBgYHtyfQoodG90YWwuc2VtYW5hICogMjApIC8gMzAKYGBgCgpEZSBubyBwYWdhciBsYSBkZXVkYSBlbiBlc2UgcGVyaW9kbywgdGVuZHJhcyBxdWUgcGFnYXIgZWwgdHJpcGxlIHBvciBjYWRhIGTDrWEgbm8gcGFnYWRvLiBEZXNncmFjaWFkYW1lbnRlLCBoYWJyw6EgMyBkw61hcyAKZW4gbG9zIHF1ZSBubyBwb2Ryw6FzIHBhZ2FyLiBDYWxjdWxhIGN1YW5kbyB0ZW5kcsOhcyBxdWUgcGFnYXIgcG9yIGVzb3MgZMOtYXMgcXVlIG5vIGN1bXBsaXN0ZSBjb24gZWwgcGFnby4KCmBgYHtyfQpkaWEucGFnbyA8LSAodG90YWwuc2VtYW5hICogMjApIC8gMzAKZGlhLnBhZ28gKiAzCmBgYAoKUGFyYSBwYWdhciBsb3MgImltcHVlc3RvcyIgdmFzIGEgdXNhciBsYSB0YW5kYSBkZSBsYSBmYW1pbGlhIHF1ZSBzb24gJDIsMDAwLiBVbmEgdmV6IHF1ZSBwYWd1ZXMgbG9zIGltcHVlc3RvcywgY3XDoW50byB0ZQp2YSBhIHNvYnJhciBkZSBsYSB0YW5kYT8KCmBgYHtyfQp0YW5kYSA8LSAyMDAwCnRhbmRhIC0gYWJzKHRvdGFsLnNlbWFuYSAqIDIwKQpgYGAKCiMjIE90cm9zIGNvbWFuZG9zIMO6bHRpbGVzIHBhcmEgYXJpdG3DqXRpY2EKCi0gRWxldmFyIGEgbGEgcG90ZW5jaWE6IGBeYApvcGVyYWNpw7NuIG1hdGVtw6F0aWNhIGVudHJlIGRvcyB0w6lybWlub3MgZGVub21pbmFkb3M6IGJhc2UgYSB5IGV4cG9uZW50ZSBuLiBTZSBlc2NyaWJlIGFuIHkgc2UgbGVlIHVzdWFsbWVudGUgY29tbwrCq2EgZWxldmFkbyBhIG7CuyBvIHRhbWJpw6luIMKrYSBlbGV2YWRvIGEgbGEgbsK7LlwKCmBgYHtyfQo1NiBeIDIKYGBgCgotIE3Ds2R1bG86ICUlIExvIHF1ZSBzb2JyYSBhbCBkaXZpZGlyIDIwMDAgZW50cmUgNTYKCmBgYHtyfQoyMDAwICUlIDU2CmBgYAoKLSBEaXZpc2nDs24gZW50ZXJhOiBzZSBkZXZ1ZWx2ZSBsYSBwYXJ0ZSBlbnRlcmEgc29sYW1lbnRlClJldmlzYXIgbGEgZGl2aXNpb24gZW50ZXJhIHkgZWwgbcOzZHVsbyBqdW50b3MKCmBgYHtyfQoyMDAwIC8gNTYgIyBkaXZpc2lvbiByZWFsCjIwMDAgJS8lIDU2ICMgZGl2aXNpb24gZW50ZXJhCmBgYAoKLSBSYcOteiBjdWFkcmFkYTogZXMgdW4gbsO6bWVybyBxdWUgYWwgc2VyIG11bHRpcGxpY2FkbyBwb3Igc8OtIG1pc21vLCBkYSBjb21vIHJlc3VsdGFkbyBlbCBuw7ptZXJvIGluaWNpYWwuCgpgYGB7cn0Kc3FydCgyKQpgYGAKCi0gRXhwb25lbnRlczogZWwgZXhwb25lbnRlIG5vcyBkaWNlIGN1w6FudGFzIHZlY2VzIHNlIHVzYSBlbCBuw7ptZXJvIGVuIHVuYSBtdWx0aXBsaWNhY2nDs24uCmV4cG9uZW50ZSBkZWwgbnVtZXJvIGUgcXVlIGVzIHVuIG7Dum1lcm8gaW1hZ2luYXJpbyAoMiw3MTgyOCkuCgpgYGB7cn0KZXhwKDEpCmBgYAoKCi0gRWwgbG9nYXJpdG1vIG5lcGVyaWFubyBkZSAobsO6bWVybyksIGF2ZWNlcyBsbGFtYWRvIG5hdHVyYWwsIHBlcm8gbm8gZXMgbG8gbWlzbW8uCkVsIGxvZ2FyaXRtbyBuYXR1cmFsIHVzZWEgZWwgbnVtZXJvIGUuCgpgYGB7cn0KbG9nKDMpCmBgYAoKLSBFbCBsb2dhcml0bW8gZGUgMyBlbiBiYXNlIDEwCgpgYGB7cn0KbG9nKDMsIDEwKQpgYGAKCi0gcGkgPSBlcyBsYSByZWxhY2nDs24gZW50cmUgZWwgcGVyw61tZXRybyBkZSB1bmEgY2lyY3VuZmVyZW5jaWEgeSBsYSBsb25naXR1ZCBkZSBzdSBkacOhbWV0cm8uCgpgYGB7cn0KcGkKYGBgCgpCdWVubywgY29uIGVzdG9zIGVqZXJjaWNpb3Mgc2UgZXNwZXJhIHF1ZSBxdWVkZW4gY2xhcm9zIGFsZ3Vub3MgY29tYW5kb3MgYsOhc2ljb3MgZGUgUiwgYXPDrSBjb21vIGxhcyBiYXNlcyBkZSBsYSBzaW50YXhpcyBkZSBlc3RlIGxlbmd1YWplIHkgcXVlIG5vIGVzICJ1biBidWVubyBuZWdvY2lvIiBqdWdhciBlbiBsYXMgVmVnYXMuCg==