Investigación de Operaciones I
Sebastián Alonso Sosa Pérez
Ramos Cornejo Jhunior Israel
Vilela Vilchez Carlos David
Yesang Cavero Narciso Eduardo


Método Simplex

Creado: 10-01-2021

Metodo Simplex

  • El Método Simplex es un método analítico de solución de problemas de programación lineal, capaz de resolver modelos más complejos que del método gráfico, en la que se pueden usar dos o mas variables, en donde se busca alcanzar el máximo o mínimo de una función lineal compuesta por un conjunto de variables que deben satisfacer condiciones impuestas por restricciones lineales en forma de inecuaciones.

  • Este método llega a la solución optima por medio de iteraciones o pasos sucesivos, utilizando los conceptos básicos del algebra matricial, para determinar la intersección de dos o mas líneas. Comienza con alguna solución factible, y sucesivamente obtiene soluciones en las intersecciones que ofrecen mejores funciones de la función objetivo.

  • Una de las características del método simplex es que la ultima solución produce una contribución tan grande o mayor que la solución previa en un problema de maximización lo que da la seguridad de llegar finalmente a la respuesta optima.

  • Nos sirve para solucionar problemas en donde debemos de optimizar nuestros recursos de la manera mas eficiente donde intervienen dos o tres a mas variables.

METODO SIMPLEX- MINIMIZACION

  • Resuelve problemas de planeación y programación de operaciones.

  • Utiliza el modelo de la programación lineal, a través de la solución de una matriz, usando el método de la eliminación de Gauss Jordan.

Metodo Simplex:

  • Investiga sólo “algunas” de estas soluciones.

  • El diseño del método simplex no permite el incremento simultáneo de las variables. En cambio, incrementa una a la vez.

  • La variable que va a aumentar es la que tenga mayor grado de mejora en z.

Ejemplo

Un empresa de moda elabora dos tipos de trajes para hombre, blazer y ejecutivos. Se cuenta con dos procesos: corte y costura. Hacer un traje tipo blazer requiere 1 hora de corte y 1 hora de costura, mientras que uno de tipo ejecutivo requiere 1 hora de corte y 2 horas de costura. El sastre trabaja un total de 4 horas al día en corte y en el proceso de costura 6 horas. Las ganancias por la venta de traje tipo Blazer es $2 por unidad y $3 por cada traje tipo ejecutivo vendido. ¿Cuántos trajes de cada tipo hay que hacer para maximizar las ganancias?

Plantiamiento

\[ x_1= 𝑁úm𝑒𝑟𝑜\ 𝑑𝑒\ 𝑡𝑟𝑎𝑗𝑒𝑠\ 𝑡𝑖𝑝𝑜 \ 𝑏𝑙𝑎𝑧𝑒𝑟 \\ x_2= 𝑁ú𝑚𝑒𝑟𝑜\ 𝑑𝑒\ 𝑡𝑟𝑎𝑗𝑒𝑠\ 𝑡𝑖𝑝𝑜\ 𝑒𝑗𝑒𝑐𝑢𝑡𝑖𝑣𝑜 \]

\[ Maximizar: 𝑍=2𝑥_1+3𝑥_2 \\ Sujeto\ a: 𝑥_1+𝑥_2≤4 \\ 𝑥_1+2𝑥_2≤4 \\ 𝑥_1≥0 \\ 𝑥_2≥0 \]

Solución:

library(lpSolve) # Librería a usar 
objetivo<- c(2,3)
restricciones<- matrix(c(2,1,3,1),ncol = 2,nrow = 2)
coef<- matrix(c(4,4),ncol = 1,nrow = 2)
signo<- c("<=","<=")
solucion<-lp(direction = "max",objective.in = objetivo,
const.mat = restricciones,
const.dir = signo,
const.rhs = coef)
solucion  
## Success: the objective function is 4

Metodo simplex dual

Al obtener modelos de P. L. de problemas reales, puede ser que el objetivo sea minimizar la función de costo, y que las restricciones sean una combinación de desigualdades de la forma mayor igual que y de la forma menor igual que. Para resolver estos modelos se ha desarrollado un algoritmo alterno al método símplex, este método se conoce con el nombre de método símplex-dual. La diferencia entre el método símplex y éste es que el primero empieza con una solución factible (todas las cantidades limitantes en las restricciones son positivas) pero no óptima, mientras que el segundo empieza en una solución no factible (algunas cantidades limitantes pueden ser negativas) pero óptima. El método presenta algunas variaciones respecto al símplex, pero en esencia se tiene el mismo procedimiento, sólo que ahora el objetivo es obtener una solución factible (que todas las cantidades limitantes sean positivas) y mantener en lo posible el objetivo de optimizar.

Algoritmo símplex-dual

  1. Se suman las variables de holgura a cada una de las restricciones de la forma menor igual que (como ya se ha descrito en el algoritmo), mientras que a las restricciones de la forma mayor igual que se les resta una variable de superávit. Se debe restar la variable porque las variables artificiales no pueden tomar valores negativos, y en el caso de desigualdades de la forma mayor igual que, lo que necesitamos es quitar la cantidad que se excede de la igualdad.

  2. Se multiplican por –1 aquellas restricciones a las que se restó una variable de superávit.

  3. Se forma la tabla símplex-dual inicial, la cual tiene las mismas características que la tabla símplex inicial. La diferencia es que algunas de las cantidades limitantes de las restricciones son negativas con una función objetivo por minimizar.

  4. Se selecciona el renglón con el mayor valor negativo, ésta es la variable que sale del sistema.

  5. Para seleccionar la variable que entra a la base, sólo se toman las columnas de las variables no básicas cuyo coeficiente del renglón seleccionado en el punto anterior sea negativo. Si no existe, entonces el modelo no tiene solución. Se divide el coeficiente de los candidatos del renglón R0 entre el coeficiente del renglón seleccionado y se toma su valor absoluto. El valor menor indica la variable que entra a la base.

  6. La celda formada por la intersección del renglón seleccionado con la columna seleccionada es el elemento pivote, este renglón se multiplica por su inverso multiplicativo y el resultado se escribe en una nueva tabla intercambiando las etiquetas de las variables que salen y entran a la base.

  7. Tomando de referencia el elemento pivote, se hacen ceros los elementos de la columna seleccionada utilizando operaciones elementales sobre matrices.

  8. Si todas las cantidades limitantes son positivas, la tabla ya es óptima: si no es así, se regresa al punto 4.

Ejemplo

LS0tDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgICNjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICAjbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KLS0tDQoNCjxjZW50ZXI+DQohW10oZG93bmxvYWQuanBnKQ0KPC9jZW50ZXI+DQo8Y2VudGVyPg0KICAgIDxiPkludmVzdGlnYWNpw7NuIGRlIE9wZXJhY2lvbmVzIEk8L2I+PGJyPg0KICAgIDxiPlNlYmFzdGnDoW4gQWxvbnNvIFNvc2EgUMOpcmV6PC9iPjxicj4NCiAgICA8Yj5SYW1vcyBDb3JuZWpvIEpodW5pb3IgSXNyYWVsPC9iPjxicj4NCiAgICA8Yj5WaWxlbGEgVmlsY2hleiBDYXJsb3MgRGF2aWQ8L2I+PGJyPg0KICAgIDxiPlllc2FuZyBDYXZlcm8gTmFyY2lzbyBFZHVhcmRvPC9iPg0KDQo8YnI+DQo8aDE+TcOpdG9kbyBTaW1wbGV4PC9oMT4NCjwvY2VudGVyPg0KPGNlbnRlcj4NCjxpPkNyZWFkbzogICAgIDEwLTAxLTIwMjENCjwvY2VudGVyPg0KDQojIE1ldG9kbyBTaW1wbGV4IA0KDQoqIEVsIE3DqXRvZG8gU2ltcGxleCBlcyB1biBtw6l0b2RvIGFuYWzDrXRpY28gZGUgc29sdWNpw7NuIGRlIHByb2JsZW1hcyBkZSBwcm9ncmFtYWNpw7NuIGxpbmVhbCwgY2FwYXogZGUgcmVzb2x2ZXIgbW9kZWxvcyBtw6FzIGNvbXBsZWpvcyBxdWUgZGVsIG3DqXRvZG8gZ3LDoWZpY28sIGVuIGxhIHF1ZSBzZSBwdWVkZW4gdXNhciBkb3MgbyBtYXMgdmFyaWFibGVzLCBlbiBkb25kZSBzZSBidXNjYSBhbGNhbnphciBlbCBtw6F4aW1vIG8gbcOtbmltbyBkZSB1bmEgZnVuY2nDs24gbGluZWFsIGNvbXB1ZXN0YSBwb3IgdW4gY29uanVudG8gZGUgdmFyaWFibGVzIHF1ZSBkZWJlbiBzYXRpc2ZhY2VyIGNvbmRpY2lvbmVzIGltcHVlc3RhcyBwb3IgcmVzdHJpY2Npb25lcyBsaW5lYWxlcyBlbiBmb3JtYSBkZSBpbmVjdWFjaW9uZXMuDQoNCiogRXN0ZSBtw6l0b2RvIGxsZWdhIGEgbGEgc29sdWNpw7NuIG9wdGltYSBwb3IgbWVkaW8gZGUgaXRlcmFjaW9uZXMgbyBwYXNvcyBzdWNlc2l2b3MsIHV0aWxpemFuZG8gbG9zIGNvbmNlcHRvcyBiw6FzaWNvcyBkZWwgYWxnZWJyYSBtYXRyaWNpYWwsIHBhcmEgZGV0ZXJtaW5hciBsYSBpbnRlcnNlY2Npw7NuIGRlIGRvcyBvIG1hcyBsw61uZWFzLiBDb21pZW56YSBjb24gYWxndW5hIHNvbHVjacOzbiBmYWN0aWJsZSwgeSBzdWNlc2l2YW1lbnRlIG9idGllbmUgc29sdWNpb25lcyBlbiBsYXMgaW50ZXJzZWNjaW9uZXMgcXVlIG9mcmVjZW4gbWVqb3JlcyBmdW5jaW9uZXMgZGUgbGEgZnVuY2nDs24gb2JqZXRpdm8uDQoNCiogVW5hIGRlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlbCBtw6l0b2RvIHNpbXBsZXggZXMgcXVlIGxhIHVsdGltYSBzb2x1Y2nDs24gcHJvZHVjZSB1bmEgY29udHJpYnVjacOzbiB0YW4gZ3JhbmRlIG8gbWF5b3IgcXVlIGxhIHNvbHVjacOzbiBwcmV2aWEgZW4gdW4gcHJvYmxlbWEgZGUgbWF4aW1pemFjacOzbiBsbyBxdWUgZGEgbGEgc2VndXJpZGFkIGRlIGxsZWdhciBmaW5hbG1lbnRlIGEgbGEgcmVzcHVlc3RhIG9wdGltYS4NCg0KKiBOb3Mgc2lydmUgcGFyYSBzb2x1Y2lvbmFyIHByb2JsZW1hcyBlbiBkb25kZSBkZWJlbW9zIGRlIG9wdGltaXphciBudWVzdHJvcyByZWN1cnNvcyBkZSBsYSBtYW5lcmEgbWFzIGVmaWNpZW50ZSBkb25kZSBpbnRlcnZpZW5lbiBkb3MgbyB0cmVzIGEgbWFzIHZhcmlhYmxlcy4NCg0KIyBNRVRPRE8gU0lNUExFWC0gTUlOSU1JWkFDSU9OIA0KDQoqIFJlc3VlbHZlIHByb2JsZW1hcyBkZSBwbGFuZWFjacOzbiB5IHByb2dyYW1hY2nDs24gIGRlIG9wZXJhY2lvbmVzLg0KDQoqIFV0aWxpemEgZWwgbW9kZWxvIGRlIGxhIHByb2dyYW1hY2nDs24gbGluZWFsLCBhIHRyYXbDqXMgZGUgbGEgc29sdWNpw7NuIGRlIHVuYSBtYXRyaXosIHVzYW5kbyBlbCBtw6l0b2RvIGRlIGxhIGVsaW1pbmFjacOzbiBkZSBHYXVzcyBKb3JkYW4uDQoNCk1ldG9kbyBTaW1wbGV4OiBcbg0KDQoqIEludmVzdGlnYSBzw7NsbyDigJxhbGd1bmFz4oCdIGRlIGVzdGFzIHNvbHVjaW9uZXMuDQoNCiogRWwgZGlzZcOxbyBkZWwgbcOpdG9kbyBzaW1wbGV4IG5vIHBlcm1pdGUgZWwgaW5jcmVtZW50byBzaW11bHTDoW5lbyBkZSBsYXMgdmFyaWFibGVzLiBFbiBjYW1iaW8sIGluY3JlbWVudGEgdW5hIGEgbGEgdmV6Lg0KDQoqIExhIHZhcmlhYmxlIHF1ZSB2YSBhIGF1bWVudGFyIGVzIGxhIHF1ZSB0ZW5nYSBtYXlvciBncmFkbyBkZSBtZWpvcmEgZW4gei4NCg0KIVtdKDQ1Ni5wbmcpDQoNCiMjIEVqZW1wbG8gDQoNClVuIGVtcHJlc2EgZGUgbW9kYSBlbGFib3JhIGRvcyB0aXBvcyBkZSB0cmFqZXMgcGFyYSBob21icmUsIGJsYXplciB5IGVqZWN1dGl2b3MuIFNlIGN1ZW50YSBjb24gZG9zIHByb2Nlc29zOiBjb3J0ZSB5IGNvc3R1cmEuDQpIYWNlciB1biB0cmFqZSB0aXBvIGJsYXplciByZXF1aWVyZSAxIGhvcmEgZGUgY29ydGUgeSAxIGhvcmEgZGUgY29zdHVyYSwgbWllbnRyYXMgcXVlIHVubyBkZSB0aXBvIGVqZWN1dGl2byByZXF1aWVyZSAxIGhvcmEgZGUgY29ydGUgeSAyIGhvcmFzIGRlIGNvc3R1cmEuDQpFbCBzYXN0cmUgdHJhYmFqYSB1biB0b3RhbCBkZSA0IGhvcmFzIGFsIGTDrWEgZW4gY29ydGUgeSBlbiBlbCBwcm9jZXNvIGRlIGNvc3R1cmEgNiBob3Jhcy4NCkxhcyBnYW5hbmNpYXMgcG9yIGxhIHZlbnRhIGRlIHRyYWplIHRpcG8gQmxhemVyIGVzICQyIHBvciB1bmlkYWQgeSAkMyBwb3IgY2FkYSB0cmFqZSB0aXBvIGVqZWN1dGl2byB2ZW5kaWRvLg0Kwr9DdcOhbnRvcyB0cmFqZXMgZGUgY2FkYSB0aXBvIGhheSBxdWUgaGFjZXIgcGFyYSBtYXhpbWl6YXIgbGFzIGdhbmFuY2lhcz8NCg0KIyMjIFBsYW50aWFtaWVudG8gDQoNCiQkDQp4XzE9IPCdkYHDum3wnZGS8J2Rn/CdkZxcIPCdkZHwnZGSXCDwnZGh8J2Rn/CdkY7wnZGX8J2RkvCdkaBcIPCdkaHwnZGW8J2RnfCdkZwgXCDwnZGP8J2RmfCdkY7wnZGn8J2RkvCdkZ8gIFxcDQp4XzI9IPCdkYHDuvCdkZrwnZGS8J2Rn/CdkZxcIPCdkZHwnZGSXCDwnZGh8J2Rn/CdkY7wnZGX8J2RkvCdkaBcIPCdkaHwnZGW8J2RnfCdkZxcIPCdkZLwnZGX8J2RkvCdkZDwnZGi8J2RofCdkZbwnZGj8J2RnA0KJCQNCg0KJCQNCk1heGltaXphcjog8J2RjT0y8J2RpV8xKzPwnZGlXzIgIFxcDQpTdWpldG9cIGE6ICAgICDwnZGlXzEr8J2RpV8y4omkNCBcXA0K8J2RpV8xKzLwnZGlXzLiiaQ0IFxcDQrwnZGlXzHiiaUwIFxcDQrwnZGlXzLiiaUwDQokJA0KDQojIyMjIFNvbHVjacOzbjogDQoNCmBgYHtyfQ0KbGlicmFyeShscFNvbHZlKSAjIExpYnJlcsOtYSBhIHVzYXIgDQpvYmpldGl2bzwtIGMoMiwzKQ0KcmVzdHJpY2Npb25lczwtIG1hdHJpeChjKDIsMSwzLDEpLG5jb2wgPSAyLG5yb3cgPSAyKQ0KY29lZjwtIG1hdHJpeChjKDQsNCksbmNvbCA9IDEsbnJvdyA9IDIpDQpzaWdubzwtIGMoIjw9IiwiPD0iKQ0Kc29sdWNpb248LWxwKGRpcmVjdGlvbiA9ICJtYXgiLG9iamVjdGl2ZS5pbiA9IG9iamV0aXZvLA0KY29uc3QubWF0ID0gcmVzdHJpY2Npb25lcywNCmNvbnN0LmRpciA9IHNpZ25vLA0KY29uc3QucmhzID0gY29lZikNCnNvbHVjaW9uICANCmBgYA0KDQojIE1ldG9kbyBzaW1wbGV4IGR1YWwgDQoNCkFsIG9idGVuZXIgbW9kZWxvcyBkZSBQLiBMLiBkZSBwcm9ibGVtYXMgcmVhbGVzLCBwdWVkZSBzZXIgcXVlIGVsDQpvYmpldGl2byBzZWEgbWluaW1pemFyIGxhIGZ1bmNpw7NuIGRlIGNvc3RvLCB5IHF1ZSBsYXMgcmVzdHJpY2Npb25lcyBzZWFuDQp1bmEgY29tYmluYWNpw7NuIGRlIGRlc2lndWFsZGFkZXMgZGUgbGEgZm9ybWEgbWF5b3IgaWd1YWwgcXVlIHkgZGUgbGENCmZvcm1hIG1lbm9yIGlndWFsIHF1ZS4gUGFyYSByZXNvbHZlciBlc3RvcyBtb2RlbG9zIHNlIGhhIGRlc2Fycm9sbGFkbw0KdW4gYWxnb3JpdG1vIGFsdGVybm8gYWwgbcOpdG9kbyBzw61tcGxleCwgZXN0ZSBtw6l0b2RvIHNlIGNvbm9jZSBjb24gZWwNCm5vbWJyZSBkZSBtw6l0b2RvIHPDrW1wbGV4LWR1YWwuIExhIGRpZmVyZW5jaWEgZW50cmUgZWwgbcOpdG9kbyBzw61tcGxleA0KeSDDqXN0ZSBlcyBxdWUgZWwgcHJpbWVybyBlbXBpZXphIGNvbiB1bmEgc29sdWNpw7NuIGZhY3RpYmxlICh0b2RhcyBsYXMNCmNhbnRpZGFkZXMgbGltaXRhbnRlcyBlbiBsYXMgcmVzdHJpY2Npb25lcyBzb24gcG9zaXRpdmFzKSBwZXJvIG5vIMOzcHRpbWEsDQptaWVudHJhcyBxdWUgZWwgc2VndW5kbyBlbXBpZXphIGVuIHVuYSBzb2x1Y2nDs24gbm8gZmFjdGlibGUgKGFsZ3VuYXMNCmNhbnRpZGFkZXMgbGltaXRhbnRlcyBwdWVkZW4gc2VyIG5lZ2F0aXZhcykgcGVybyDDs3B0aW1hLiBFbCBtw6l0b2RvDQpwcmVzZW50YSBhbGd1bmFzIHZhcmlhY2lvbmVzIHJlc3BlY3RvIGFsIHPDrW1wbGV4LCBwZXJvIGVuIGVzZW5jaWEgc2UNCnRpZW5lIGVsIG1pc21vIHByb2NlZGltaWVudG8sIHPDs2xvIHF1ZSBhaG9yYSBlbCBvYmpldGl2byBlcyBvYnRlbmVyIHVuYQ0Kc29sdWNpw7NuIGZhY3RpYmxlIChxdWUgdG9kYXMgbGFzIGNhbnRpZGFkZXMgbGltaXRhbnRlcyBzZWFuIHBvc2l0aXZhcykgeQ0KbWFudGVuZXIgZW4gbG8gcG9zaWJsZSBlbCBvYmpldGl2byBkZSBvcHRpbWl6YXIuIA0KDQojIyAgQWxnb3JpdG1vIHPDrW1wbGV4LWR1YWwNCg0KMS4gU2Ugc3VtYW4gbGFzIHZhcmlhYmxlcyBkZSBob2xndXJhIGEgY2FkYSB1bmEgZGUgbGFzIHJlc3RyaWNjaW9uZXMgZGUNCmxhIGZvcm1hIG1lbm9yIGlndWFsIHF1ZSAoY29tbyB5YSBzZSBoYSBkZXNjcml0byBlbiBlbCBhbGdvcml0bW8pLA0KbWllbnRyYXMgcXVlIGEgbGFzIHJlc3RyaWNjaW9uZXMgZGUgbGEgZm9ybWEgbWF5b3IgaWd1YWwgcXVlIHNlIGxlcw0KcmVzdGEgdW5hIHZhcmlhYmxlIGRlIHN1cGVyw6F2aXQuIFNlIGRlYmUgcmVzdGFyIGxhIHZhcmlhYmxlIHBvcnF1ZSBsYXMNCnZhcmlhYmxlcyBhcnRpZmljaWFsZXMgbm8gcHVlZGVuIHRvbWFyIHZhbG9yZXMgbmVnYXRpdm9zLCB5IGVuIGVsIGNhc28NCmRlIGRlc2lndWFsZGFkZXMgZGUgbGEgZm9ybWEgbWF5b3IgaWd1YWwgcXVlLCBsbyBxdWUgbmVjZXNpdGFtb3MgZXMNCnF1aXRhciBsYSBjYW50aWRhZCBxdWUgc2UgZXhjZWRlIGRlIGxhIGlndWFsZGFkLg0KDQoyLiBTZSBtdWx0aXBsaWNhbiBwb3Ig4oCTMSBhcXVlbGxhcyByZXN0cmljY2lvbmVzIGEgbGFzIHF1ZSBzZSByZXN0w7MgdW5hDQp2YXJpYWJsZSBkZSBzdXBlcsOhdml0LiANCg0KMy4gU2UgZm9ybWEgbGEgdGFibGEgc8OtbXBsZXgtZHVhbCBpbmljaWFsLCBsYSBjdWFsIHRpZW5lIGxhcyBtaXNtYXMNCmNhcmFjdGVyw61zdGljYXMgcXVlIGxhIHRhYmxhIHPDrW1wbGV4IGluaWNpYWwuIExhIGRpZmVyZW5jaWEgZXMgcXVlDQphbGd1bmFzIGRlIGxhcyBjYW50aWRhZGVzIGxpbWl0YW50ZXMgZGUgbGFzIHJlc3RyaWNjaW9uZXMgc29uIG5lZ2F0aXZhcw0KY29uIHVuYSBmdW5jacOzbiBvYmpldGl2byBwb3IgbWluaW1pemFyLg0KDQo0LiBTZSBzZWxlY2Npb25hIGVsIHJlbmdsw7NuIGNvbiBlbCBtYXlvciB2YWxvciBuZWdhdGl2bywgw6lzdGEgZXMgbGENCnZhcmlhYmxlIHF1ZSBzYWxlIGRlbCBzaXN0ZW1hLg0KDQo1LiBQYXJhIHNlbGVjY2lvbmFyIGxhIHZhcmlhYmxlIHF1ZSBlbnRyYSBhIGxhIGJhc2UsIHPDs2xvIHNlIHRvbWFuIGxhcw0KY29sdW1uYXMgZGUgbGFzIHZhcmlhYmxlcyBubyBiw6FzaWNhcyBjdXlvIGNvZWZpY2llbnRlIGRlbCByZW5nbMOzbg0Kc2VsZWNjaW9uYWRvIGVuIGVsIHB1bnRvIGFudGVyaW9yIHNlYSBuZWdhdGl2by4gU2kgbm8gZXhpc3RlLCBlbnRvbmNlcyBlbA0KbW9kZWxvIG5vIHRpZW5lIHNvbHVjacOzbi4gU2UgZGl2aWRlIGVsIGNvZWZpY2llbnRlIGRlIGxvcyBjYW5kaWRhdG9zIGRlbA0KcmVuZ2zDs24gUjANCiBlbnRyZSBlbCBjb2VmaWNpZW50ZSBkZWwgcmVuZ2zDs24gc2VsZWNjaW9uYWRvIHkgc2UgdG9tYSBzdQ0KdmFsb3IgYWJzb2x1dG8uIEVsIHZhbG9yIG1lbm9yIGluZGljYSBsYSB2YXJpYWJsZSBxdWUgZW50cmEgYSBsYSBiYXNlLg0KDQo2LiBMYSBjZWxkYSBmb3JtYWRhIHBvciBsYSBpbnRlcnNlY2Npw7NuIGRlbCByZW5nbMOzbiBzZWxlY2Npb25hZG8gY29uIGxhDQpjb2x1bW5hIHNlbGVjY2lvbmFkYSBlcyBlbCBlbGVtZW50byBwaXZvdGUsIGVzdGUgcmVuZ2zDs24gc2UgbXVsdGlwbGljYQ0KcG9yIHN1IGludmVyc28gbXVsdGlwbGljYXRpdm8geSBlbCByZXN1bHRhZG8gc2UgZXNjcmliZSBlbiB1bmEgbnVldmEgdGFibGENCmludGVyY2FtYmlhbmRvIGxhcyBldGlxdWV0YXMgZGUgbGFzIHZhcmlhYmxlcyBxdWUgc2FsZW4geSBlbnRyYW4gYSBsYSBiYXNlLiANCg0KNy4gIFRvbWFuZG8gZGUgcmVmZXJlbmNpYSBlbCBlbGVtZW50byBwaXZvdGUsIHNlIGhhY2VuIGNlcm9zIGxvcyBlbGVtZW50b3MNCmRlIGxhIGNvbHVtbmEgc2VsZWNjaW9uYWRhIHV0aWxpemFuZG8gb3BlcmFjaW9uZXMgZWxlbWVudGFsZXMgc29icmUNCm1hdHJpY2VzLg0KDQo4LiBTaSB0b2RhcyBsYXMgY2FudGlkYWRlcyBsaW1pdGFudGVzIHNvbiBwb3NpdGl2YXMsIGxhIHRhYmxhIHlhIGVzIMOzcHRpbWE6DQpzaSBubyBlcyBhc8OtLCBzZSByZWdyZXNhIGFsIHB1bnRvIDQuDQoNCiMjIEVqZW1wbG8gDQoNCiFbXShkMS5wbmcpDQoNCiFbXShkMi5wbmcpDQoNCiFbXShkMy5wbmcpDQoNCiFbXShkNy5wbmcp