CTIC - UNIVERSIDAD NACIONAL DE INGENIERIA

Programación en R para DataScience

Perfil Linkelind

Google Drive

Presentación del Codigo - Pregunta 1
> #Importamos los achivos bank y bank-names
> #Creando Cabeceras
nombres <-c("age","job","marital","education","default","balance","housing","loan","contac","day","month","duration","campaign","pdays","previous","poutcome","Sub")
> #Importando
bdbank <- read.csv(file="bank.csv",header = FALSE,sep=";",col.names = nombres)
> #Datos - Observamos que Apersar de indicar expresamente que NO importar las cabeceras, estas se importaron
head(bdbank)
  age         job marital education default balance housing loan   contac day month duration campaign pdays previous poutcome Sub
1 age         job marital education default balance housing loan  contact day month duration campaign pdays previous poutcome   y
2  30  unemployed married   primary      no    1787      no   no cellular  19   oct       79        1    -1        0  unknown  no
3  33    services married secondary      no    4789     yes  yes cellular  11   may      220        1   339        4  failure  no
4  35  management  single  tertiary      no    1350     yes   no cellular  16   apr      185        1   330        1  failure  no
5  30  management married  tertiary      no    1476     yes  yes  unknown   3   jun      199        4    -1        0  unknown  no
6  59 blue-collar married secondary      no       0     yes   no  unknown   5   may      226        1    -1        0  unknown  no
> #Covertimos a DataFrame
> df_bank = as.data.frame(bdbank)
> head(df_bank)
> #Eliminamos la Primera Fila
> df_bank<-df_bank[!(df_bank$age=="age"),]
> head(df_bank)
  age         job marital education default balance housing loan   contac day month duration campaign pdays previous poutcome Sub
2  30  unemployed married   primary      no    1787      no   no cellular  19   oct       79        1    -1        0  unknown  no
3  33    services married secondary      no    4789     yes  yes cellular  11   may      220        1   339        4  failure  no
4  35  management  single  tertiary      no    1350     yes   no cellular  16   apr      185        1   330        1  failure  no
5  30  management married  tertiary      no    1476     yes  yes  unknown   3   jun      199        4    -1        0  unknown  no
6  59 blue-collar married secondary      no       0     yes   no  unknown   5   may      226        1    -1        0  unknown  no
7  35  management  single  tertiary      no     747      no   no cellular  23   feb      141        2   176        3  failure  no
> #Realizar un Analisis Exploratorio
> summary(df_bank)
     age                job              marital           education           default            balance            housing         
 Length:4521        Length:4521        Length:4521        Length:4521        Length:4521        Length:4521        Length:4521       
 Class :character   Class :character   Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
     loan              contac              day               month             duration           campaign            pdays          
 Length:4521        Length:4521        Length:4521        Length:4521        Length:4521        Length:4521        Length:4521       
 Class :character   Class :character   Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
   previous           poutcome             Sub           
 Length:4521        Length:4521        Length:4521       
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  
> lapply(df_bank,class)
$age
[1] "character"

$job
[1] "character"

$marital
[1] "character"

$education
[1] "character"

$default
[1] "character"

$balance
[1] "character"

$housing
[1] "character"

$loan
[1] "character"

$contac
[1] "character"

$day
[1] "character"

$month
[1] "character"

$duration
[1] "character"

$campaign
[1] "character"

$pdays
[1] "character"

$previous
[1] "character"

$poutcome
[1] "character"

$Sub
[1] "character"
Presentación del Codigo - Pregunta 2
> #Creando Cabeceras
nombres <-c("buying","maint","doors","persons","lug_boot","safety","ND")

> #Importando
bdcar <- read.table(file="car.data",header = FALSE,sep=",",col.names = nombres)

> #Datos
> head(bdcar)
  buying maint doors persons lug_boot safety    ND
1  vhigh vhigh     2       2    small    low unacc
2  vhigh vhigh     2       2    small    med unacc
3  vhigh vhigh     2       2    small   high unacc
4  vhigh vhigh     2       2      med    low unacc
5  vhigh vhigh     2       2      med    med unacc
6  vhigh vhigh     2       2      med   high unacc

> #Creando DataFrame
> df_auto<-as.data.frame(bdcar)
> head(df_auto)
  buying maint doors persons lug_boot safety    ND
1  vhigh vhigh     2       2    small    low unacc
2  vhigh vhigh     2       2    small    med unacc
3  vhigh vhigh     2       2    small   high unacc
4  vhigh vhigh     2       2      med    low unacc
5  vhigh vhigh     2       2      med    med unacc
6  vhigh vhigh     2       2      med   high unacc

> #Extratendo un SubDataFrame
> sub_df_auto<-subset.data.frame(x=df_auto,df_auto$safety=="high" & df_auto$lug_boot=="big")
> head(sub_df_auto)
   buying maint doors persons lug_boot safety    ND
9   vhigh vhigh     2       2      big   high unacc
18  vhigh vhigh     2       4      big   high unacc
27  vhigh vhigh     2    more      big   high unacc
36  vhigh vhigh     3       2      big   high unacc
45  vhigh vhigh     3       4      big   high unacc
54  vhigh vhigh     3    more      big   high unacc
Presentación del Codigo - Pregunta 3
> #Importando
bdwine <- read.csv(file="winequality-red.csv",header = TRUE,sep=";")

> #Datos
> head(bdwine)
  fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density   pH sulphates alcohol quality
1           7.4             0.70        0.00            1.9     0.076                  11                   34  0.9978 3.51      0.56     9.4       5
2           7.8             0.88        0.00            2.6     0.098                  25                   67  0.9968 3.20      0.68     9.8       5
3           7.8             0.76        0.04            2.3     0.092                  15                   54  0.9970 3.26      0.65     9.8       5
4          11.2             0.28        0.56            1.9     0.075                  17                   60  0.9980 3.16      0.58     9.8       6
5           7.4             0.70        0.00            1.9     0.076                  11                   34  0.9978 3.51      0.56     9.4       5
6           7.4             0.66        0.00            1.8     0.075                  13                   40  0.9978 3.51      0.56     9.4       5

> #Convirtiendo en DataFrame
> df_vinorojo<-as.data.frame(bdwine)
> head(df_vinorojo)
  fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density   pH sulphates alcohol quality
1           7.4             0.70        0.00            1.9     0.076                  11                   34  0.9978 3.51      0.56     9.4       5
2           7.8             0.88        0.00            2.6     0.098                  25                   67  0.9968 3.20      0.68     9.8       5
3           7.8             0.76        0.04            2.3     0.092                  15                   54  0.9970 3.26      0.65     9.8       5
4          11.2             0.28        0.56            1.9     0.075                  17                   60  0.9980 3.16      0.58     9.8       6
5           7.4             0.70        0.00            1.9     0.076                  11                   34  0.9978 3.51      0.56     9.4       5
6           7.4             0.66        0.00            1.8     0.075                  13                   40  0.9978 3.51      0.56     9.4       5

> #Capturando un SubDataFrame
> df_vinorojo_filtro<-subset.data.frame(x=df_vinorojo,df_vinorojo$density>0.9975 & df_vinorojo$quality>5)
> head(df_vinorojo_filtro)
    fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density   pH sulphates alcohol quality
4            11.2            0.280        0.56            1.9     0.075                  17                   60  0.9980 3.16      0.58     9.8       6
34            6.9            0.605        0.12           10.7     0.073                  40                   83  0.9993 3.45      0.52     9.4       6
36            7.8            0.645        0.00            5.5     0.086                   5                   18  0.9986 3.40      0.55     9.6       6
109           8.0            0.330        0.53            2.5     0.091                  18                   80  0.9976 3.37      0.80     9.6       6
114          10.1            0.310        0.44            2.3     0.080                  22                   46  0.9988 3.32      0.67     9.7       6
117           8.3            0.540        0.28            1.9     0.077                  11                   40  0.9978 3.39      0.61    10.0       6
Presentación del Codigo - Pregunta 4
> #Importando
> bdwine <- read.csv(file="winequality-white.csv",header = TRUE,sep=";")

> #Datos
> head(bdwine)
 fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density   pH sulphates alcohol quality
1           7.0             0.27        0.36           20.7     0.045                  45                  170  1.0010 3.00      0.45     8.8       6
2           6.3             0.30        0.34            1.6     0.049                  14                  132  0.9940 3.30      0.49     9.5       6
3           8.1             0.28        0.40            6.9     0.050                  30                   97  0.9951 3.26      0.44    10.1       6
4           7.2             0.23        0.32            8.5     0.058                  47                  186  0.9956 3.19      0.40     9.9       6
5           7.2             0.23        0.32            8.5     0.058                  47                  186  0.9956 3.19      0.40     9.9       6
6           8.1             0.28        0.40            6.9     0.050                  30                   97  0.9951 3.26      0.44    10.1       6

> #Convirtiendo en DataFrame
> df_vinoblanco<-as.data.frame(bdwine)
> head(df_vinoblanco)
  fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density   pH sulphates alcohol quality
1           7.0             0.27        0.36           20.7     0.045                  45                  170  1.0010 3.00      0.45     8.8       6
2           6.3             0.30        0.34            1.6     0.049                  14                  132  0.9940 3.30      0.49     9.5       6
3           8.1             0.28        0.40            6.9     0.050                  30                   97  0.9951 3.26      0.44    10.1       6
4           7.2             0.23        0.32            8.5     0.058                  47                  186  0.9956 3.19      0.40     9.9       6
5           7.2             0.23        0.32            8.5     0.058                  47                  186  0.9956 3.19      0.40     9.9       6
6           8.1             0.28        0.40            6.9     0.050                  30                   97  0.9951 3.26      0.44    10.1       6

> #Capturando un SubDataFrame
> df_vinoblanco_filtro<-subset.data.frame(x=df_vinoblanco,df_vinoblanco$density>0.9975 & df_vinoblanco$quality>5)
> head(df_vinoblanco_filtro)
    fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density   pH sulphates alcohol quality
1             7.0             0.27        0.36           20.7     0.045                  45                  170  1.0010 3.00      0.45     8.8       6
8             7.0             0.27        0.36           20.7     0.045                  45                  170  1.0010 3.00      0.45     8.8       6
82            7.1             0.20        0.34           16.0     0.050                  51                  166  0.9985 3.21      0.60     9.2       6
97            6.0             0.34        0.66           15.9     0.046                  26                  164  0.9979 3.14      0.50     8.8       6
100           6.0             0.34        0.66           15.9     0.046                  26                  164  0.9979 3.14      0.50     8.8       6
108           7.1             0.23        0.35           16.5     0.040                  60                  171  0.9990 3.16      0.59     9.1       6
Presentación del Codigo - Pregunta 5
> #Recordemos que para ambos vinos se aplico un filtro de estandares de calidad, donde se planeteo que la densidad del vino fuese mayor a 0.9975 y que su calidad mayor 5

> #Cantidad de Registros que Cumplen con las Restricciones
> dim(df_vinorojo_filtro)
[1] 234  12
> dim(df_vinoblanco_filtro)
[1] 396  12

> #Histogramas respecto a la densidad de los Vinos
> hist(x=df_vinorojo_filtro$density, main = "Histograma de Densidad Vino Rojo", xlab = "Densidad", ylab = "Frecuencia", col = "red")
> hist(x=df_vinorojo_filtro$density, main = "Histograma de Densidad Vino Blanco", xlab = "Densidad", ylab = "Frecuencia", col = "ivory")

> #Diagrama de Dispersión
> plot(x=df_vinorojo_filtro$fixed.acidity,y=df_vinorojo_filtro$volatile.acidity, main = "Diagrama de Dispersion del Vino Rojo", xlab = "fixed acidity", ylab = "volatile acidity")
plot(x=df_vinoblanco_filtro$fixed.acidity,y=df_vinoblanco_filtro$volatile.acidity, main = "Diagrama de Dispersion del Vino Blanco", xlab = "fixed acidity", ylab = "volatile acidity")
LS0tDQp0aXRsZTogIlIgcGFyYSBEYXRhU2NpZW5jZSwgVGFyZWEgTsKwMyINCmF1dGhvcjogIkNhbHZvIFF1aXNwZSwgTHVpcyBBbnRvbmlvIg0KZGF0ZTogIjIwMjIvMDUvMjkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCjwhLS0gQmllbnZlbmlkb3MgYWwgUHJveWVjdG8gZGUgTHVpcyBBbnRvbmlvIENhbHZvIFF1aXNwZSAtLT4NCg0KPGNlbnRlcj4NCiMjIyBDVElDIC0gVU5JVkVSU0lEQUQgTkFDSU9OQUwgREUgSU5HRU5JRVJJQQ0KIVtdKExvZ28ucG5nKXt3aWR0aD01MDBweH0NCg0KPC9jZW50ZXI+DQoNCjxjZW50ZXI+DQojIyMjIFByb2dyYW1hY2nDs24gZW4gUiBwYXJhIERhdGFTY2llbmNlDQpbUGVyZmlsIExpbmtlbGluZF0oaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2x1aXMtYW50b25pby1jYWx2by1xdWlzcGUtNTdhMzNiMjI5LyAiSW5ncmVzYXIgYWwgUGVyZmlsIGRlbCBDb21wYcOxZXJvIil7dGFyZ2V0PSJfYmxhbmsifQ0KDQoNCltHb29nbGUgRHJpdmVdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9kcml2ZS9mb2xkZXJzLzFOV2N5ZC1xWjg3b0RlWVV1VnJzekJxTFBlTTRldFB3Mz91c3A9c2hhcmluZyAiSW5ncmVzYXIgYSBsYSBDYXJwZXRhIENvbXBhcnRpZGEiKXt0YXJnZXQ9Il9ibGFuayJ9DQo8L2NlbnRlcj4NCjxicj4NCjxjZW50ZXI+DQoqKlByZXNlbnRhY2nDs24gZGVsIENvZGlnbyAtIFByZWd1bnRhIDEqKg0KPC9jZW50ZXI+DQpgYGBSDQo+ICNJbXBvcnRhbW9zIGxvcyBhY2hpdm9zIGJhbmsgeSBiYW5rLW5hbWVzDQo+ICNDcmVhbmRvIENhYmVjZXJhcw0Kbm9tYnJlcyA8LWMoImFnZSIsImpvYiIsIm1hcml0YWwiLCJlZHVjYXRpb24iLCJkZWZhdWx0IiwiYmFsYW5jZSIsImhvdXNpbmciLCJsb2FuIiwiY29udGFjIiwiZGF5IiwibW9udGgiLCJkdXJhdGlvbiIsImNhbXBhaWduIiwicGRheXMiLCJwcmV2aW91cyIsInBvdXRjb21lIiwiU3ViIikNCj4gI0ltcG9ydGFuZG8NCmJkYmFuayA8LSByZWFkLmNzdihmaWxlPSJiYW5rLmNzdiIsaGVhZGVyID0gRkFMU0Usc2VwPSI7Iixjb2wubmFtZXMgPSBub21icmVzKQ0KPiAjRGF0b3MgLSBPYnNlcnZhbW9zIHF1ZSBBcGVyc2FyIGRlIGluZGljYXIgZXhwcmVzYW1lbnRlIHF1ZSBOTyBpbXBvcnRhciBsYXMgY2FiZWNlcmFzLCBlc3RhcyBzZSBpbXBvcnRhcm9uDQpoZWFkKGJkYmFuaykNCiAgYWdlICAgICAgICAgam9iIG1hcml0YWwgZWR1Y2F0aW9uIGRlZmF1bHQgYmFsYW5jZSBob3VzaW5nIGxvYW4gICBjb250YWMgZGF5IG1vbnRoIGR1cmF0aW9uIGNhbXBhaWduIHBkYXlzIHByZXZpb3VzIHBvdXRjb21lIFN1Yg0KMSBhZ2UgICAgICAgICBqb2IgbWFyaXRhbCBlZHVjYXRpb24gZGVmYXVsdCBiYWxhbmNlIGhvdXNpbmcgbG9hbiAgY29udGFjdCBkYXkgbW9udGggZHVyYXRpb24gY2FtcGFpZ24gcGRheXMgcHJldmlvdXMgcG91dGNvbWUgICB5DQoyICAzMCAgdW5lbXBsb3llZCBtYXJyaWVkICAgcHJpbWFyeSAgICAgIG5vICAgIDE3ODcgICAgICBubyAgIG5vIGNlbGx1bGFyICAxOSAgIG9jdCAgICAgICA3OSAgICAgICAgMSAgICAtMSAgICAgICAgMCAgdW5rbm93biAgbm8NCjMgIDMzICAgIHNlcnZpY2VzIG1hcnJpZWQgc2Vjb25kYXJ5ICAgICAgbm8gICAgNDc4OSAgICAgeWVzICB5ZXMgY2VsbHVsYXIgIDExICAgbWF5ICAgICAgMjIwICAgICAgICAxICAgMzM5ICAgICAgICA0ICBmYWlsdXJlICBubw0KNCAgMzUgIG1hbmFnZW1lbnQgIHNpbmdsZSAgdGVydGlhcnkgICAgICBubyAgICAxMzUwICAgICB5ZXMgICBubyBjZWxsdWxhciAgMTYgICBhcHIgICAgICAxODUgICAgICAgIDEgICAzMzAgICAgICAgIDEgIGZhaWx1cmUgIG5vDQo1ICAzMCAgbWFuYWdlbWVudCBtYXJyaWVkICB0ZXJ0aWFyeSAgICAgIG5vICAgIDE0NzYgICAgIHllcyAgeWVzICB1bmtub3duICAgMyAgIGp1biAgICAgIDE5OSAgICAgICAgNCAgICAtMSAgICAgICAgMCAgdW5rbm93biAgbm8NCjYgIDU5IGJsdWUtY29sbGFyIG1hcnJpZWQgc2Vjb25kYXJ5ICAgICAgbm8gICAgICAgMCAgICAgeWVzICAgbm8gIHVua25vd24gICA1ICAgbWF5ICAgICAgMjI2ICAgICAgICAxICAgIC0xICAgICAgICAwICB1bmtub3duICBubw0KPiAjQ292ZXJ0aW1vcyBhIERhdGFGcmFtZQ0KPiBkZl9iYW5rID0gYXMuZGF0YS5mcmFtZShiZGJhbmspDQo+IGhlYWQoZGZfYmFuaykNCj4gI0VsaW1pbmFtb3MgbGEgUHJpbWVyYSBGaWxhDQo+IGRmX2Jhbms8LWRmX2JhbmtbIShkZl9iYW5rJGFnZT09ImFnZSIpLF0NCj4gaGVhZChkZl9iYW5rKQ0KICBhZ2UgICAgICAgICBqb2IgbWFyaXRhbCBlZHVjYXRpb24gZGVmYXVsdCBiYWxhbmNlIGhvdXNpbmcgbG9hbiAgIGNvbnRhYyBkYXkgbW9udGggZHVyYXRpb24gY2FtcGFpZ24gcGRheXMgcHJldmlvdXMgcG91dGNvbWUgU3ViDQoyICAzMCAgdW5lbXBsb3llZCBtYXJyaWVkICAgcHJpbWFyeSAgICAgIG5vICAgIDE3ODcgICAgICBubyAgIG5vIGNlbGx1bGFyICAxOSAgIG9jdCAgICAgICA3OSAgICAgICAgMSAgICAtMSAgICAgICAgMCAgdW5rbm93biAgbm8NCjMgIDMzICAgIHNlcnZpY2VzIG1hcnJpZWQgc2Vjb25kYXJ5ICAgICAgbm8gICAgNDc4OSAgICAgeWVzICB5ZXMgY2VsbHVsYXIgIDExICAgbWF5ICAgICAgMjIwICAgICAgICAxICAgMzM5ICAgICAgICA0ICBmYWlsdXJlICBubw0KNCAgMzUgIG1hbmFnZW1lbnQgIHNpbmdsZSAgdGVydGlhcnkgICAgICBubyAgICAxMzUwICAgICB5ZXMgICBubyBjZWxsdWxhciAgMTYgICBhcHIgICAgICAxODUgICAgICAgIDEgICAzMzAgICAgICAgIDEgIGZhaWx1cmUgIG5vDQo1ICAzMCAgbWFuYWdlbWVudCBtYXJyaWVkICB0ZXJ0aWFyeSAgICAgIG5vICAgIDE0NzYgICAgIHllcyAgeWVzICB1bmtub3duICAgMyAgIGp1biAgICAgIDE5OSAgICAgICAgNCAgICAtMSAgICAgICAgMCAgdW5rbm93biAgbm8NCjYgIDU5IGJsdWUtY29sbGFyIG1hcnJpZWQgc2Vjb25kYXJ5ICAgICAgbm8gICAgICAgMCAgICAgeWVzICAgbm8gIHVua25vd24gICA1ICAgbWF5ICAgICAgMjI2ICAgICAgICAxICAgIC0xICAgICAgICAwICB1bmtub3duICBubw0KNyAgMzUgIG1hbmFnZW1lbnQgIHNpbmdsZSAgdGVydGlhcnkgICAgICBubyAgICAgNzQ3ICAgICAgbm8gICBubyBjZWxsdWxhciAgMjMgICBmZWIgICAgICAxNDEgICAgICAgIDIgICAxNzYgICAgICAgIDMgIGZhaWx1cmUgIG5vDQo+ICNSZWFsaXphciB1biBBbmFsaXNpcyBFeHBsb3JhdG9yaW8NCj4gc3VtbWFyeShkZl9iYW5rKQ0KICAgICBhZ2UgICAgICAgICAgICAgICAgam9iICAgICAgICAgICAgICBtYXJpdGFsICAgICAgICAgICBlZHVjYXRpb24gICAgICAgICAgIGRlZmF1bHQgICAgICAgICAgICBiYWxhbmNlICAgICAgICAgICAgaG91c2luZyAgICAgICAgIA0KIExlbmd0aDo0NTIxICAgICAgICBMZW5ndGg6NDUyMSAgICAgICAgTGVuZ3RoOjQ1MjEgICAgICAgIExlbmd0aDo0NTIxICAgICAgICBMZW5ndGg6NDUyMSAgICAgICAgTGVuZ3RoOjQ1MjEgICAgICAgIExlbmd0aDo0NTIxICAgICAgIA0KIENsYXNzIDpjaGFyYWN0ZXIgICBDbGFzcyA6Y2hhcmFjdGVyICAgQ2xhc3MgOmNoYXJhY3RlciAgIENsYXNzIDpjaGFyYWN0ZXIgICBDbGFzcyA6Y2hhcmFjdGVyICAgQ2xhc3MgOmNoYXJhY3RlciAgIENsYXNzIDpjaGFyYWN0ZXIgIA0KIE1vZGUgIDpjaGFyYWN0ZXIgICBNb2RlICA6Y2hhcmFjdGVyICAgTW9kZSAgOmNoYXJhY3RlciAgIE1vZGUgIDpjaGFyYWN0ZXIgICBNb2RlICA6Y2hhcmFjdGVyICAgTW9kZSAgOmNoYXJhY3RlciAgIE1vZGUgIDpjaGFyYWN0ZXIgIA0KICAgICBsb2FuICAgICAgICAgICAgICBjb250YWMgICAgICAgICAgICAgIGRheSAgICAgICAgICAgICAgIG1vbnRoICAgICAgICAgICAgIGR1cmF0aW9uICAgICAgICAgICBjYW1wYWlnbiAgICAgICAgICAgIHBkYXlzICAgICAgICAgIA0KIExlbmd0aDo0NTIxICAgICAgICBMZW5ndGg6NDUyMSAgICAgICAgTGVuZ3RoOjQ1MjEgICAgICAgIExlbmd0aDo0NTIxICAgICAgICBMZW5ndGg6NDUyMSAgICAgICAgTGVuZ3RoOjQ1MjEgICAgICAgIExlbmd0aDo0NTIxICAgICAgIA0KIENsYXNzIDpjaGFyYWN0ZXIgICBDbGFzcyA6Y2hhcmFjdGVyICAgQ2xhc3MgOmNoYXJhY3RlciAgIENsYXNzIDpjaGFyYWN0ZXIgICBDbGFzcyA6Y2hhcmFjdGVyICAgQ2xhc3MgOmNoYXJhY3RlciAgIENsYXNzIDpjaGFyYWN0ZXIgIA0KIE1vZGUgIDpjaGFyYWN0ZXIgICBNb2RlICA6Y2hhcmFjdGVyICAgTW9kZSAgOmNoYXJhY3RlciAgIE1vZGUgIDpjaGFyYWN0ZXIgICBNb2RlICA6Y2hhcmFjdGVyICAgTW9kZSAgOmNoYXJhY3RlciAgIE1vZGUgIDpjaGFyYWN0ZXIgIA0KICAgcHJldmlvdXMgICAgICAgICAgIHBvdXRjb21lICAgICAgICAgICAgIFN1YiAgICAgICAgICAgDQogTGVuZ3RoOjQ1MjEgICAgICAgIExlbmd0aDo0NTIxICAgICAgICBMZW5ndGg6NDUyMSAgICAgICANCiBDbGFzcyA6Y2hhcmFjdGVyICAgQ2xhc3MgOmNoYXJhY3RlciAgIENsYXNzIDpjaGFyYWN0ZXIgIA0KIE1vZGUgIDpjaGFyYWN0ZXIgICBNb2RlICA6Y2hhcmFjdGVyICAgTW9kZSAgOmNoYXJhY3RlciAgDQo+IGxhcHBseShkZl9iYW5rLGNsYXNzKQ0KJGFnZQ0KWzFdICJjaGFyYWN0ZXIiDQoNCiRqb2INClsxXSAiY2hhcmFjdGVyIg0KDQokbWFyaXRhbA0KWzFdICJjaGFyYWN0ZXIiDQoNCiRlZHVjYXRpb24NClsxXSAiY2hhcmFjdGVyIg0KDQokZGVmYXVsdA0KWzFdICJjaGFyYWN0ZXIiDQoNCiRiYWxhbmNlDQpbMV0gImNoYXJhY3RlciINCg0KJGhvdXNpbmcNClsxXSAiY2hhcmFjdGVyIg0KDQokbG9hbg0KWzFdICJjaGFyYWN0ZXIiDQoNCiRjb250YWMNClsxXSAiY2hhcmFjdGVyIg0KDQokZGF5DQpbMV0gImNoYXJhY3RlciINCg0KJG1vbnRoDQpbMV0gImNoYXJhY3RlciINCg0KJGR1cmF0aW9uDQpbMV0gImNoYXJhY3RlciINCg0KJGNhbXBhaWduDQpbMV0gImNoYXJhY3RlciINCg0KJHBkYXlzDQpbMV0gImNoYXJhY3RlciINCg0KJHByZXZpb3VzDQpbMV0gImNoYXJhY3RlciINCg0KJHBvdXRjb21lDQpbMV0gImNoYXJhY3RlciINCg0KJFN1Yg0KWzFdICJjaGFyYWN0ZXIiDQpgYGANCjxjZW50ZXI+DQoqKlByZXNlbnRhY2nDs24gZGVsIENvZGlnbyAtIFByZWd1bnRhIDIqKg0KPC9jZW50ZXI+DQpgYGBSDQo+ICNDcmVhbmRvIENhYmVjZXJhcw0Kbm9tYnJlcyA8LWMoImJ1eWluZyIsIm1haW50IiwiZG9vcnMiLCJwZXJzb25zIiwibHVnX2Jvb3QiLCJzYWZldHkiLCJORCIpDQoNCj4gI0ltcG9ydGFuZG8NCmJkY2FyIDwtIHJlYWQudGFibGUoZmlsZT0iY2FyLmRhdGEiLGhlYWRlciA9IEZBTFNFLHNlcD0iLCIsY29sLm5hbWVzID0gbm9tYnJlcykNCg0KPiAjRGF0b3MNCj4gaGVhZChiZGNhcikNCiAgYnV5aW5nIG1haW50IGRvb3JzIHBlcnNvbnMgbHVnX2Jvb3Qgc2FmZXR5ICAgIE5EDQoxICB2aGlnaCB2aGlnaCAgICAgMiAgICAgICAyICAgIHNtYWxsICAgIGxvdyB1bmFjYw0KMiAgdmhpZ2ggdmhpZ2ggICAgIDIgICAgICAgMiAgICBzbWFsbCAgICBtZWQgdW5hY2MNCjMgIHZoaWdoIHZoaWdoICAgICAyICAgICAgIDIgICAgc21hbGwgICBoaWdoIHVuYWNjDQo0ICB2aGlnaCB2aGlnaCAgICAgMiAgICAgICAyICAgICAgbWVkICAgIGxvdyB1bmFjYw0KNSAgdmhpZ2ggdmhpZ2ggICAgIDIgICAgICAgMiAgICAgIG1lZCAgICBtZWQgdW5hY2MNCjYgIHZoaWdoIHZoaWdoICAgICAyICAgICAgIDIgICAgICBtZWQgICBoaWdoIHVuYWNjDQoNCj4gI0NyZWFuZG8gRGF0YUZyYW1lDQo+IGRmX2F1dG88LWFzLmRhdGEuZnJhbWUoYmRjYXIpDQo+IGhlYWQoZGZfYXV0bykNCiAgYnV5aW5nIG1haW50IGRvb3JzIHBlcnNvbnMgbHVnX2Jvb3Qgc2FmZXR5ICAgIE5EDQoxICB2aGlnaCB2aGlnaCAgICAgMiAgICAgICAyICAgIHNtYWxsICAgIGxvdyB1bmFjYw0KMiAgdmhpZ2ggdmhpZ2ggICAgIDIgICAgICAgMiAgICBzbWFsbCAgICBtZWQgdW5hY2MNCjMgIHZoaWdoIHZoaWdoICAgICAyICAgICAgIDIgICAgc21hbGwgICBoaWdoIHVuYWNjDQo0ICB2aGlnaCB2aGlnaCAgICAgMiAgICAgICAyICAgICAgbWVkICAgIGxvdyB1bmFjYw0KNSAgdmhpZ2ggdmhpZ2ggICAgIDIgICAgICAgMiAgICAgIG1lZCAgICBtZWQgdW5hY2MNCjYgIHZoaWdoIHZoaWdoICAgICAyICAgICAgIDIgICAgICBtZWQgICBoaWdoIHVuYWNjDQoNCj4gI0V4dHJhdGVuZG8gdW4gU3ViRGF0YUZyYW1lDQo+IHN1Yl9kZl9hdXRvPC1zdWJzZXQuZGF0YS5mcmFtZSh4PWRmX2F1dG8sZGZfYXV0byRzYWZldHk9PSJoaWdoIiAmIGRmX2F1dG8kbHVnX2Jvb3Q9PSJiaWciKQ0KPiBoZWFkKHN1Yl9kZl9hdXRvKQ0KICAgYnV5aW5nIG1haW50IGRvb3JzIHBlcnNvbnMgbHVnX2Jvb3Qgc2FmZXR5ICAgIE5EDQo5ICAgdmhpZ2ggdmhpZ2ggICAgIDIgICAgICAgMiAgICAgIGJpZyAgIGhpZ2ggdW5hY2MNCjE4ICB2aGlnaCB2aGlnaCAgICAgMiAgICAgICA0ICAgICAgYmlnICAgaGlnaCB1bmFjYw0KMjcgIHZoaWdoIHZoaWdoICAgICAyICAgIG1vcmUgICAgICBiaWcgICBoaWdoIHVuYWNjDQozNiAgdmhpZ2ggdmhpZ2ggICAgIDMgICAgICAgMiAgICAgIGJpZyAgIGhpZ2ggdW5hY2MNCjQ1ICB2aGlnaCB2aGlnaCAgICAgMyAgICAgICA0ICAgICAgYmlnICAgaGlnaCB1bmFjYw0KNTQgIHZoaWdoIHZoaWdoICAgICAzICAgIG1vcmUgICAgICBiaWcgICBoaWdoIHVuYWNjDQpgYGANCjxjZW50ZXI+DQoqKlByZXNlbnRhY2nDs24gZGVsIENvZGlnbyAtIFByZWd1bnRhIDMqKg0KPC9jZW50ZXI+DQpgYGBSDQo+ICNJbXBvcnRhbmRvDQpiZHdpbmUgPC0gcmVhZC5jc3YoZmlsZT0id2luZXF1YWxpdHktcmVkLmNzdiIsaGVhZGVyID0gVFJVRSxzZXA9IjsiKQ0KDQo+ICNEYXRvcw0KPiBoZWFkKGJkd2luZSkNCiAgZml4ZWQuYWNpZGl0eSB2b2xhdGlsZS5hY2lkaXR5IGNpdHJpYy5hY2lkIHJlc2lkdWFsLnN1Z2FyIGNobG9yaWRlcyBmcmVlLnN1bGZ1ci5kaW94aWRlIHRvdGFsLnN1bGZ1ci5kaW94aWRlIGRlbnNpdHkgICBwSCBzdWxwaGF0ZXMgYWxjb2hvbCBxdWFsaXR5DQoxICAgICAgICAgICA3LjQgICAgICAgICAgICAgMC43MCAgICAgICAgMC4wMCAgICAgICAgICAgIDEuOSAgICAgMC4wNzYgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgICAgICAgICAzNCAgMC45OTc4IDMuNTEgICAgICAwLjU2ICAgICA5LjQgICAgICAgNQ0KMiAgICAgICAgICAgNy44ICAgICAgICAgICAgIDAuODggICAgICAgIDAuMDAgICAgICAgICAgICAyLjYgICAgIDAuMDk4ICAgICAgICAgICAgICAgICAgMjUgICAgICAgICAgICAgICAgICAgNjcgIDAuOTk2OCAzLjIwICAgICAgMC42OCAgICAgOS44ICAgICAgIDUNCjMgICAgICAgICAgIDcuOCAgICAgICAgICAgICAwLjc2ICAgICAgICAwLjA0ICAgICAgICAgICAgMi4zICAgICAwLjA5MiAgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgICAgICAgICAgIDU0ICAwLjk5NzAgMy4yNiAgICAgIDAuNjUgICAgIDkuOCAgICAgICA1DQo0ICAgICAgICAgIDExLjIgICAgICAgICAgICAgMC4yOCAgICAgICAgMC41NiAgICAgICAgICAgIDEuOSAgICAgMC4wNzUgICAgICAgICAgICAgICAgICAxNyAgICAgICAgICAgICAgICAgICA2MCAgMC45OTgwIDMuMTYgICAgICAwLjU4ICAgICA5LjggICAgICAgNg0KNSAgICAgICAgICAgNy40ICAgICAgICAgICAgIDAuNzAgICAgICAgIDAuMDAgICAgICAgICAgICAxLjkgICAgIDAuMDc2ICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgICAgICAgICAgMzQgIDAuOTk3OCAzLjUxICAgICAgMC41NiAgICAgOS40ICAgICAgIDUNCjYgICAgICAgICAgIDcuNCAgICAgICAgICAgICAwLjY2ICAgICAgICAwLjAwICAgICAgICAgICAgMS44ICAgICAwLjA3NSAgICAgICAgICAgICAgICAgIDEzICAgICAgICAgICAgICAgICAgIDQwICAwLjk5NzggMy41MSAgICAgIDAuNTYgICAgIDkuNCAgICAgICA1DQoNCj4gI0NvbnZpcnRpZW5kbyBlbiBEYXRhRnJhbWUNCj4gZGZfdmlub3Jvam88LWFzLmRhdGEuZnJhbWUoYmR3aW5lKQ0KPiBoZWFkKGRmX3Zpbm9yb2pvKQ0KICBmaXhlZC5hY2lkaXR5IHZvbGF0aWxlLmFjaWRpdHkgY2l0cmljLmFjaWQgcmVzaWR1YWwuc3VnYXIgY2hsb3JpZGVzIGZyZWUuc3VsZnVyLmRpb3hpZGUgdG90YWwuc3VsZnVyLmRpb3hpZGUgZGVuc2l0eSAgIHBIIHN1bHBoYXRlcyBhbGNvaG9sIHF1YWxpdHkNCjEgICAgICAgICAgIDcuNCAgICAgICAgICAgICAwLjcwICAgICAgICAwLjAwICAgICAgICAgICAgMS45ICAgICAwLjA3NiAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICAgICAgIDM0ICAwLjk5NzggMy41MSAgICAgIDAuNTYgICAgIDkuNCAgICAgICA1DQoyICAgICAgICAgICA3LjggICAgICAgICAgICAgMC44OCAgICAgICAgMC4wMCAgICAgICAgICAgIDIuNiAgICAgMC4wOTggICAgICAgICAgICAgICAgICAyNSAgICAgICAgICAgICAgICAgICA2NyAgMC45OTY4IDMuMjAgICAgICAwLjY4ICAgICA5LjggICAgICAgNQ0KMyAgICAgICAgICAgNy44ICAgICAgICAgICAgIDAuNzYgICAgICAgIDAuMDQgICAgICAgICAgICAyLjMgICAgIDAuMDkyICAgICAgICAgICAgICAgICAgMTUgICAgICAgICAgICAgICAgICAgNTQgIDAuOTk3MCAzLjI2ICAgICAgMC42NSAgICAgOS44ICAgICAgIDUNCjQgICAgICAgICAgMTEuMiAgICAgICAgICAgICAwLjI4ICAgICAgICAwLjU2ICAgICAgICAgICAgMS45ICAgICAwLjA3NSAgICAgICAgICAgICAgICAgIDE3ICAgICAgICAgICAgICAgICAgIDYwICAwLjk5ODAgMy4xNiAgICAgIDAuNTggICAgIDkuOCAgICAgICA2DQo1ICAgICAgICAgICA3LjQgICAgICAgICAgICAgMC43MCAgICAgICAgMC4wMCAgICAgICAgICAgIDEuOSAgICAgMC4wNzYgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgICAgICAgICAzNCAgMC45OTc4IDMuNTEgICAgICAwLjU2ICAgICA5LjQgICAgICAgNQ0KNiAgICAgICAgICAgNy40ICAgICAgICAgICAgIDAuNjYgICAgICAgIDAuMDAgICAgICAgICAgICAxLjggICAgIDAuMDc1ICAgICAgICAgICAgICAgICAgMTMgICAgICAgICAgICAgICAgICAgNDAgIDAuOTk3OCAzLjUxICAgICAgMC41NiAgICAgOS40ICAgICAgIDUNCg0KPiAjQ2FwdHVyYW5kbyB1biBTdWJEYXRhRnJhbWUNCj4gZGZfdmlub3Jvam9fZmlsdHJvPC1zdWJzZXQuZGF0YS5mcmFtZSh4PWRmX3Zpbm9yb2pvLGRmX3Zpbm9yb2pvJGRlbnNpdHk+MC45OTc1ICYgZGZfdmlub3Jvam8kcXVhbGl0eT41KQ0KPiBoZWFkKGRmX3Zpbm9yb2pvX2ZpbHRybykNCiAgICBmaXhlZC5hY2lkaXR5IHZvbGF0aWxlLmFjaWRpdHkgY2l0cmljLmFjaWQgcmVzaWR1YWwuc3VnYXIgY2hsb3JpZGVzIGZyZWUuc3VsZnVyLmRpb3hpZGUgdG90YWwuc3VsZnVyLmRpb3hpZGUgZGVuc2l0eSAgIHBIIHN1bHBoYXRlcyBhbGNvaG9sIHF1YWxpdHkNCjQgICAgICAgICAgICAxMS4yICAgICAgICAgICAgMC4yODAgICAgICAgIDAuNTYgICAgICAgICAgICAxLjkgICAgIDAuMDc1ICAgICAgICAgICAgICAgICAgMTcgICAgICAgICAgICAgICAgICAgNjAgIDAuOTk4MCAzLjE2ICAgICAgMC41OCAgICAgOS44ICAgICAgIDYNCjM0ICAgICAgICAgICAgNi45ICAgICAgICAgICAgMC42MDUgICAgICAgIDAuMTIgICAgICAgICAgIDEwLjcgICAgIDAuMDczICAgICAgICAgICAgICAgICAgNDAgICAgICAgICAgICAgICAgICAgODMgIDAuOTk5MyAzLjQ1ICAgICAgMC41MiAgICAgOS40ICAgICAgIDYNCjM2ICAgICAgICAgICAgNy44ICAgICAgICAgICAgMC42NDUgICAgICAgIDAuMDAgICAgICAgICAgICA1LjUgICAgIDAuMDg2ICAgICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICAgICAgMTggIDAuOTk4NiAzLjQwICAgICAgMC41NSAgICAgOS42ICAgICAgIDYNCjEwOSAgICAgICAgICAgOC4wICAgICAgICAgICAgMC4zMzAgICAgICAgIDAuNTMgICAgICAgICAgICAyLjUgICAgIDAuMDkxICAgICAgICAgICAgICAgICAgMTggICAgICAgICAgICAgICAgICAgODAgIDAuOTk3NiAzLjM3ICAgICAgMC44MCAgICAgOS42ICAgICAgIDYNCjExNCAgICAgICAgICAxMC4xICAgICAgICAgICAgMC4zMTAgICAgICAgIDAuNDQgICAgICAgICAgICAyLjMgICAgIDAuMDgwICAgICAgICAgICAgICAgICAgMjIgICAgICAgICAgICAgICAgICAgNDYgIDAuOTk4OCAzLjMyICAgICAgMC42NyAgICAgOS43ICAgICAgIDYNCjExNyAgICAgICAgICAgOC4zICAgICAgICAgICAgMC41NDAgICAgICAgIDAuMjggICAgICAgICAgICAxLjkgICAgIDAuMDc3ICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgICAgICAgICAgNDAgIDAuOTk3OCAzLjM5ICAgICAgMC42MSAgICAxMC4wICAgICAgIDYNCmBgYA0KPGNlbnRlcj4NCioqUHJlc2VudGFjacOzbiBkZWwgQ29kaWdvIC0gUHJlZ3VudGEgNCoqDQo8L2NlbnRlcj4NCmBgYFINCj4gI0ltcG9ydGFuZG8NCj4gYmR3aW5lIDwtIHJlYWQuY3N2KGZpbGU9IndpbmVxdWFsaXR5LXdoaXRlLmNzdiIsaGVhZGVyID0gVFJVRSxzZXA9IjsiKQ0KDQo+ICNEYXRvcw0KPiBoZWFkKGJkd2luZSkNCiBmaXhlZC5hY2lkaXR5IHZvbGF0aWxlLmFjaWRpdHkgY2l0cmljLmFjaWQgcmVzaWR1YWwuc3VnYXIgY2hsb3JpZGVzIGZyZWUuc3VsZnVyLmRpb3hpZGUgdG90YWwuc3VsZnVyLmRpb3hpZGUgZGVuc2l0eSAgIHBIIHN1bHBoYXRlcyBhbGNvaG9sIHF1YWxpdHkNCjEgICAgICAgICAgIDcuMCAgICAgICAgICAgICAwLjI3ICAgICAgICAwLjM2ICAgICAgICAgICAyMC43ICAgICAwLjA0NSAgICAgICAgICAgICAgICAgIDQ1ICAgICAgICAgICAgICAgICAgMTcwICAxLjAwMTAgMy4wMCAgICAgIDAuNDUgICAgIDguOCAgICAgICA2DQoyICAgICAgICAgICA2LjMgICAgICAgICAgICAgMC4zMCAgICAgICAgMC4zNCAgICAgICAgICAgIDEuNiAgICAgMC4wNDkgICAgICAgICAgICAgICAgICAxNCAgICAgICAgICAgICAgICAgIDEzMiAgMC45OTQwIDMuMzAgICAgICAwLjQ5ICAgICA5LjUgICAgICAgNg0KMyAgICAgICAgICAgOC4xICAgICAgICAgICAgIDAuMjggICAgICAgIDAuNDAgICAgICAgICAgICA2LjkgICAgIDAuMDUwICAgICAgICAgICAgICAgICAgMzAgICAgICAgICAgICAgICAgICAgOTcgIDAuOTk1MSAzLjI2ICAgICAgMC40NCAgICAxMC4xICAgICAgIDYNCjQgICAgICAgICAgIDcuMiAgICAgICAgICAgICAwLjIzICAgICAgICAwLjMyICAgICAgICAgICAgOC41ICAgICAwLjA1OCAgICAgICAgICAgICAgICAgIDQ3ICAgICAgICAgICAgICAgICAgMTg2ICAwLjk5NTYgMy4xOSAgICAgIDAuNDAgICAgIDkuOSAgICAgICA2DQo1ICAgICAgICAgICA3LjIgICAgICAgICAgICAgMC4yMyAgICAgICAgMC4zMiAgICAgICAgICAgIDguNSAgICAgMC4wNTggICAgICAgICAgICAgICAgICA0NyAgICAgICAgICAgICAgICAgIDE4NiAgMC45OTU2IDMuMTkgICAgICAwLjQwICAgICA5LjkgICAgICAgNg0KNiAgICAgICAgICAgOC4xICAgICAgICAgICAgIDAuMjggICAgICAgIDAuNDAgICAgICAgICAgICA2LjkgICAgIDAuMDUwICAgICAgICAgICAgICAgICAgMzAgICAgICAgICAgICAgICAgICAgOTcgIDAuOTk1MSAzLjI2ICAgICAgMC40NCAgICAxMC4xICAgICAgIDYNCg0KPiAjQ29udmlydGllbmRvIGVuIERhdGFGcmFtZQ0KPiBkZl92aW5vYmxhbmNvPC1hcy5kYXRhLmZyYW1lKGJkd2luZSkNCj4gaGVhZChkZl92aW5vYmxhbmNvKQ0KICBmaXhlZC5hY2lkaXR5IHZvbGF0aWxlLmFjaWRpdHkgY2l0cmljLmFjaWQgcmVzaWR1YWwuc3VnYXIgY2hsb3JpZGVzIGZyZWUuc3VsZnVyLmRpb3hpZGUgdG90YWwuc3VsZnVyLmRpb3hpZGUgZGVuc2l0eSAgIHBIIHN1bHBoYXRlcyBhbGNvaG9sIHF1YWxpdHkNCjEgICAgICAgICAgIDcuMCAgICAgICAgICAgICAwLjI3ICAgICAgICAwLjM2ICAgICAgICAgICAyMC43ICAgICAwLjA0NSAgICAgICAgICAgICAgICAgIDQ1ICAgICAgICAgICAgICAgICAgMTcwICAxLjAwMTAgMy4wMCAgICAgIDAuNDUgICAgIDguOCAgICAgICA2DQoyICAgICAgICAgICA2LjMgICAgICAgICAgICAgMC4zMCAgICAgICAgMC4zNCAgICAgICAgICAgIDEuNiAgICAgMC4wNDkgICAgICAgICAgICAgICAgICAxNCAgICAgICAgICAgICAgICAgIDEzMiAgMC45OTQwIDMuMzAgICAgICAwLjQ5ICAgICA5LjUgICAgICAgNg0KMyAgICAgICAgICAgOC4xICAgICAgICAgICAgIDAuMjggICAgICAgIDAuNDAgICAgICAgICAgICA2LjkgICAgIDAuMDUwICAgICAgICAgICAgICAgICAgMzAgICAgICAgICAgICAgICAgICAgOTcgIDAuOTk1MSAzLjI2ICAgICAgMC40NCAgICAxMC4xICAgICAgIDYNCjQgICAgICAgICAgIDcuMiAgICAgICAgICAgICAwLjIzICAgICAgICAwLjMyICAgICAgICAgICAgOC41ICAgICAwLjA1OCAgICAgICAgICAgICAgICAgIDQ3ICAgICAgICAgICAgICAgICAgMTg2ICAwLjk5NTYgMy4xOSAgICAgIDAuNDAgICAgIDkuOSAgICAgICA2DQo1ICAgICAgICAgICA3LjIgICAgICAgICAgICAgMC4yMyAgICAgICAgMC4zMiAgICAgICAgICAgIDguNSAgICAgMC4wNTggICAgICAgICAgICAgICAgICA0NyAgICAgICAgICAgICAgICAgIDE4NiAgMC45OTU2IDMuMTkgICAgICAwLjQwICAgICA5LjkgICAgICAgNg0KNiAgICAgICAgICAgOC4xICAgICAgICAgICAgIDAuMjggICAgICAgIDAuNDAgICAgICAgICAgICA2LjkgICAgIDAuMDUwICAgICAgICAgICAgICAgICAgMzAgICAgICAgICAgICAgICAgICAgOTcgIDAuOTk1MSAzLjI2ICAgICAgMC40NCAgICAxMC4xICAgICAgIDYNCg0KPiAjQ2FwdHVyYW5kbyB1biBTdWJEYXRhRnJhbWUNCj4gZGZfdmlub2JsYW5jb19maWx0cm88LXN1YnNldC5kYXRhLmZyYW1lKHg9ZGZfdmlub2JsYW5jbyxkZl92aW5vYmxhbmNvJGRlbnNpdHk+MC45OTc1ICYgZGZfdmlub2JsYW5jbyRxdWFsaXR5PjUpDQo+IGhlYWQoZGZfdmlub2JsYW5jb19maWx0cm8pDQogICAgZml4ZWQuYWNpZGl0eSB2b2xhdGlsZS5hY2lkaXR5IGNpdHJpYy5hY2lkIHJlc2lkdWFsLnN1Z2FyIGNobG9yaWRlcyBmcmVlLnN1bGZ1ci5kaW94aWRlIHRvdGFsLnN1bGZ1ci5kaW94aWRlIGRlbnNpdHkgICBwSCBzdWxwaGF0ZXMgYWxjb2hvbCBxdWFsaXR5DQoxICAgICAgICAgICAgIDcuMCAgICAgICAgICAgICAwLjI3ICAgICAgICAwLjM2ICAgICAgICAgICAyMC43ICAgICAwLjA0NSAgICAgICAgICAgICAgICAgIDQ1ICAgICAgICAgICAgICAgICAgMTcwICAxLjAwMTAgMy4wMCAgICAgIDAuNDUgICAgIDguOCAgICAgICA2DQo4ICAgICAgICAgICAgIDcuMCAgICAgICAgICAgICAwLjI3ICAgICAgICAwLjM2ICAgICAgICAgICAyMC43ICAgICAwLjA0NSAgICAgICAgICAgICAgICAgIDQ1ICAgICAgICAgICAgICAgICAgMTcwICAxLjAwMTAgMy4wMCAgICAgIDAuNDUgICAgIDguOCAgICAgICA2DQo4MiAgICAgICAgICAgIDcuMSAgICAgICAgICAgICAwLjIwICAgICAgICAwLjM0ICAgICAgICAgICAxNi4wICAgICAwLjA1MCAgICAgICAgICAgICAgICAgIDUxICAgICAgICAgICAgICAgICAgMTY2ICAwLjk5ODUgMy4yMSAgICAgIDAuNjAgICAgIDkuMiAgICAgICA2DQo5NyAgICAgICAgICAgIDYuMCAgICAgICAgICAgICAwLjM0ICAgICAgICAwLjY2ICAgICAgICAgICAxNS45ICAgICAwLjA0NiAgICAgICAgICAgICAgICAgIDI2ICAgICAgICAgICAgICAgICAgMTY0ICAwLjk5NzkgMy4xNCAgICAgIDAuNTAgICAgIDguOCAgICAgICA2DQoxMDAgICAgICAgICAgIDYuMCAgICAgICAgICAgICAwLjM0ICAgICAgICAwLjY2ICAgICAgICAgICAxNS45ICAgICAwLjA0NiAgICAgICAgICAgICAgICAgIDI2ICAgICAgICAgICAgICAgICAgMTY0ICAwLjk5NzkgMy4xNCAgICAgIDAuNTAgICAgIDguOCAgICAgICA2DQoxMDggICAgICAgICAgIDcuMSAgICAgICAgICAgICAwLjIzICAgICAgICAwLjM1ICAgICAgICAgICAxNi41ICAgICAwLjA0MCAgICAgICAgICAgICAgICAgIDYwICAgICAgICAgICAgICAgICAgMTcxICAwLjk5OTAgMy4xNiAgICAgIDAuNTkgICAgIDkuMSAgICAgICA2DQpgYGANCg0KPGNlbnRlcj4NCioqUHJlc2VudGFjacOzbiBkZWwgQ29kaWdvIC0gUHJlZ3VudGEgNSoqDQo8L2NlbnRlcj4NCmBgYFINCj4gI1JlY29yZGVtb3MgcXVlIHBhcmEgYW1ib3Mgdmlub3Mgc2UgYXBsaWNvIHVuIGZpbHRybyBkZSBlc3RhbmRhcmVzIGRlIGNhbGlkYWQsIGRvbmRlIHNlIHBsYW5ldGVvIHF1ZSBsYSBkZW5zaWRhZCBkZWwgdmlubyBmdWVzZSBtYXlvciBhIDAuOTk3NSB5IHF1ZSBzdSBjYWxpZGFkIG1heW9yIDUNCg0KPiAjQ2FudGlkYWQgZGUgUmVnaXN0cm9zIHF1ZSBDdW1wbGVuIGNvbiBsYXMgUmVzdHJpY2Npb25lcw0KPiBkaW0oZGZfdmlub3Jvam9fZmlsdHJvKQ0KWzFdIDIzNCAgMTINCj4gZGltKGRmX3Zpbm9ibGFuY29fZmlsdHJvKQ0KWzFdIDM5NiAgMTINCg0KPiAjSGlzdG9ncmFtYXMgcmVzcGVjdG8gYSBsYSBkZW5zaWRhZCBkZSBsb3MgVmlub3MNCj4gaGlzdCh4PWRmX3Zpbm9yb2pvX2ZpbHRybyRkZW5zaXR5LCBtYWluID0gIkhpc3RvZ3JhbWEgZGUgRGVuc2lkYWQgVmlubyBSb2pvIiwgeGxhYiA9ICJEZW5zaWRhZCIsIHlsYWIgPSAiRnJlY3VlbmNpYSIsIGNvbCA9ICJyZWQiKQ0KPiBoaXN0KHg9ZGZfdmlub3Jvam9fZmlsdHJvJGRlbnNpdHksIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBEZW5zaWRhZCBWaW5vIEJsYW5jbyIsIHhsYWIgPSAiRGVuc2lkYWQiLCB5bGFiID0gIkZyZWN1ZW5jaWEiLCBjb2wgPSAiaXZvcnkiKQ0KDQo+ICNEaWFncmFtYSBkZSBEaXNwZXJzacOzbg0KPiBwbG90KHg9ZGZfdmlub3Jvam9fZmlsdHJvJGZpeGVkLmFjaWRpdHkseT1kZl92aW5vcm9qb19maWx0cm8kdm9sYXRpbGUuYWNpZGl0eSwgbWFpbiA9ICJEaWFncmFtYSBkZSBEaXNwZXJzaW9uIGRlbCBWaW5vIFJvam8iLCB4bGFiID0gImZpeGVkIGFjaWRpdHkiLCB5bGFiID0gInZvbGF0aWxlIGFjaWRpdHkiKQ0KcGxvdCh4PWRmX3Zpbm9ibGFuY29fZmlsdHJvJGZpeGVkLmFjaWRpdHkseT1kZl92aW5vYmxhbmNvX2ZpbHRybyR2b2xhdGlsZS5hY2lkaXR5LCBtYWluID0gIkRpYWdyYW1hIGRlIERpc3BlcnNpb24gZGVsIFZpbm8gQmxhbmNvIiwgeGxhYiA9ICJmaXhlZCBhY2lkaXR5IiwgeWxhYiA9ICJ2b2xhdGlsZSBhY2lkaXR5IikNCmBgYA0KPGNlbnRlcj4NCiFbXShScGxvdEgxLnBuZyl7d2lkdGg9NTAwcHh9DQohW10oUnBsb3RIMi5wbmcpe3dpZHRoPTUwMHB4fQ0KIVtdKFJwbG90RDEucG5nKXt3aWR0aD01MDBweH0NCiFbXShScGxvdEQyLnBuZyl7d2lkdGg9NTAwcHh9DQo8L2NlbnRlcj4NCg==