3. Ejercicio práctico
Como un primer acercamiento utilizaremos una de las librerías más completas de PLN: UDPipe, creada por la Facultad de Matemáticas y Física de la Universidad de República Checa y descargaremos un modelo pre-entrenado guardado como un objeto en R:
# Descarga de modelo preentrenado udpipe
library(udpipe)
#udpipe::udpipe_download_model('spanish') # Descomentar al ejecutar por primera vez
Ahora cargaremos el modelo en español descargado y lo utilizaremos para anotar una frase (ayudándonos de la librería stringr para evitar problemas con la codificación, y de la librería dplyr para manipular los resultados):
library(stringi)
library(dplyr)
# Carga de modelo pre-entrenado
model = udpipe_load_model(file = "spanish-gsd-ud-2.4-190531.udpipe")
# Anotación
text = "Estamos muy interesados en saber cuál será el proyecto de fin de curso."
text_annotated = udpipe_annotate(model, x = stri_enc_toutf8(text))
text_annotated = text_annotated %>% as_tibble(encoding="latin-1")
Finalmente presentaremos el resultado tabular (con la librería kableExtra para que la tabla se vea bien):
library(kableExtra)
text_annotated %>% select(token, lemma, upos, feats, head_token_id) %>% kable() %>% kable_styling(font_size = 14)
| token |
lemma |
upos |
feats |
head_token_id |
| Estamos |
estar |
AUX |
Mood=Ind|Number=Plur|Person=1|Tense=Pres|VerbForm=Fin |
3 |
| muy |
mucho |
ADV |
NA |
3 |
| interesados |
interesado |
ADJ |
Gender=Masc|Number=Plur|VerbForm=Part |
0 |
| en |
en |
ADP |
NA |
5 |
| saber |
saber |
VERB |
VerbForm=Inf |
3 |
| cuál |
cuál |
PRON |
Number=Sing|PronType=Int,Rel |
9 |
| será |
ser |
AUX |
Mood=Ind|Number=Sing|Person=3|Tense=Fut|VerbForm=Fin |
9 |
| el |
el |
DET |
Definite=Def|Gender=Masc|Number=Sing|PronType=Art |
9 |
| proyecto |
proyecto |
NOUN |
Gender=Masc|Number=Sing |
5 |
| de |
de |
ADP |
NA |
11 |
| fin |
fin |
NOUN |
Gender=Masc|Number=Sing |
9 |
| de |
de |
ADP |
NA |
13 |
| curso |
curso |
NOUN |
Gender=Masc|Number=Sing |
11 |
| . |
. |
PUNCT |
NA |
3 |
Y con un gráfico (basado en las librerías ggplot2, igraph y ggraph, adaptado de la entrada ‘dependency parsing with udpipe’, r-bloggers.com):
library(igraph)
library(ggraph)
library(ggplot2)
# Función para graficar dependencias
plot_annotation = function(x, size = 3){
stopifnot(is.data.frame(x) & all(c("sentence_id", "token_id", "head_token_id", "dep_rel",
"token_id", "token", "lemma", "upos", "xpos", "feats") %in% colnames(x)))
x = x[!is.na(x$head_token_id), ]
x = x[x$sentence_id %in% min(x$sentence_id), ]
edges = x[x$head_token_id != 0, c("token_id", "head_token_id", "dep_rel")]
edges$label = edges$dep_rel
g = graph_from_data_frame(edges,
vertices = x[, c("token_id", "token", "lemma", "upos", "xpos", "feats")],
directed = TRUE)
gf = ggraph(g, layout = "linear") +
geom_edge_arc(aes(label = dep_rel, vjust = -0.20),
arrow = grid::arrow(length = unit(4, 'mm'), ends = "last", type = "closed"),
label_colour = "red", check_overlap = TRUE, label_size = size) +
geom_node_label(aes(label = token), col = "darkgreen", size = size, fontface = "bold") +
geom_node_text(aes(label = upos), nudge_y = -0.35, size = size) +
labs(title = "Resultado UDpipe",
subtitle = "Tokenización, etiquetado POS y relaciones de dependencia")
return(gf)
}
# Gráfico
plot_annotation(text_annotated)

Para interpretar los resultados de dependencias es necesario referirnos a universaldependencies.org, la cual está construida sobre la investigación de De Marneffe y otros (2014).
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBjb21wb3J0YW1pZW50byBlbiByZWRlcyBzb2NpYWxlcyB1c2FuZG8gUHJvY2VzYW1pZW50byBkZWwgTGVuZ3VhamUgTmF0dXJhbCINCnN1YnRpdGxlOiAnQ2Fww610dWxvIDI6ICBDb25vY2ltaWVudG9zIGRlbCBsZW5ndWFqZSwgbW9yZm9sb2fDrWEsIHNpbnRheGlzLCB5IHNlbcOhbnRpY2EnDQphdXRob3I6IEh1Z28gUG9ycmFzDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIGNzczogRXN0aWxvcy5jc3MNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDINCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQpiaWJsaW9ncmFwaHk6IEJpYmxpb2dyYWZpYS5iaWINCmNzbDogY2VwYWwueG1sDQotLS0NCg0KIyAqKjEuIFBMTiB5IExlbmd1YWplIG5hdHVyYWwqKg0KDQojIyAqKjEuMS4gwr9RdcOpIGVzIHVuIGxlbmd1YWplIG5hdHVyYWw/KioNCg0KPGJyPjwvYnI+DQo8Y2VudGVyPjxhPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX0xlbmd1YWplTmF0dXJhbC5qcGciPjwvYT48L2NlbnRlcj4NCjxicj48L2JyPg0KDQpQYXJhIEBTYXJrYXIyMDE5Og0KDQpFbCBsZW5ndWFqZSBuYXR1cmFsIGVzIHVuIGxlbmd1YWplIGRlc2Fycm9sbGFkbyB5IGV2b2x1Y2lvbmFkbyBwb3IgbG9zIGh1bWFub3MgYSB0cmF2w6lzIGRlbCB1c28geSBjb211bmljYWNpw7NuICJuYXR1cmFsIiAoZGlzdGludG8gYSB1biBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuKS4gVGFsIGxlbmd1YWplIHB1ZWRlIHNlciBleHByZXNhZG8gZGUgbWFuZXJhIGVzY3JpdGEsIHZlcmJhbCBvIGluY2x1c28gbWVkaWFudGUgc2XDsWFzLg0KDQo8YnI+PC9icj4NCg0KIyMgKioxLjIuIENvbm9jaW1pZW50byBkZWwgbGVuZ3VhamUgdXNhZG8gZW4gUExOKioNCg0KPGJyPjwvYnI+DQo8Y2VudGVyPjxhPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX0NTX0xpbmd1aXN0aWNzLmpwZWciPjwvYT48L2NlbnRlcj4NCjxicj48L2JyPg0KDQpBY29yZGUgYSBAVmlsbGFsb25nYTIwMTk6DQoNCisgUGFyYSBlbCBwcm9jZXNhbWllbnRvIGRlbCBsZW5ndWFqZSBuYXR1cmFsIHNlIHJlcXVpZXJlIGRlbCBjb25vY2ltaWVudG8gZGUgw6FyZWFzIGNvbW8gbGEgZm9uw6l0aWNhLCBsYSBmb25vbG9nw61hLCBsYSBtb3Jmb2xvZ8OtYSwgbGEgc2ludGF4aXMsIGxhIHNlbcOhbnRpY2EsIGxhIHByYWdtw6F0aWNhIHkgZWwgZGlzY3Vyc28uDQorIExhICoqZm9uw6l0aWNhKiogeSBsYSAqKmZvbm9sb2fDrWEqKiBzZSByZWxhY2lvbmFuIGFsIGNvbm9jaW1pZW50byBzb2JyZSBsb3Mgc29uaWRvcyBsaW5ndcOtc3RpY29zLg0KKyBMYSAqKm1vcmZvbG9nw61hKiogZXMgZWwgY29ub2NpbWllbnRvIGRlIGxvcyBjb21wb25lbnRlcyBzaWduaWZpY2F0aXZvcyBkZSBsYXMgcGFsYWJyYXMuIEVzdGEgbm9zIHNpcnZlIHBvciBlamVtcGxvLCBwYXJhIGlkZW50aWZpY2FyIHF1ZSAnJ3B1ZXJ0YXMnJyBlcyBlbCBwbHVyYWwgZGUgJydwdWVydGEnJy4NCisgTGEgKipzaW50YXhpcyoqIGVzIGVsIGNvbm9jaW1pZW50byBkZSBsYXMgcmVsYWNpb25lcyBlc3RydWN0dXJhbGVzIGVudHJlIHBhbGFicmFzLiBQb3IgZWplbXBsbywgbm9zIHNpcnZlIHBhcmEgc2FiZXIgY8OzbW8gZW5jYWRlbmFyIGxhcyBwYWxhYnJhcyBlbiB1bmEgcmVzcHVlc3RhLg0KKyBMYSAqKnNlbcOhbnRpY2EqKiBlcyBlbCBjb25vY2ltaWVudG8gZGVsIHNpZ25pZmljYWRvLiBFc3RhIHNlIGFwbGljYSBwb3IgZWplbXBsbywgcGFyYSBlbnRlbmRlciBlbCBzaWduaWZpY2FkbyBkZSBwYWxhYnJhcyBhaXNsYWRhcyBvIGVuIGNvbmp1bnRvLCB5IGRlIHNhYmVyIHF1ZSBkaWNobyBzaWduaWZpY2FkbyBwdWVkZSB2YXJpYXIgZW4gZGlzdGludG9zIGVzY2VuYXJpb3MuDQorIExhICoqcHJhZ23DoXRpY2EqKiBlcyBlbCBjb25vY2ltaWVudG8gZGUgbGEgcmVsYWNpw7NuIGRlbCBzaWduaWZpY2FkbyBjb24gbG9zIG9iamV0aXZvcyB5IGxhcyBpbnRlbmNpb25lcy4gRXMgZGVjaXIsIG5vcyBzaXJ2ZSBwYXJhIHNhYmVyIGVsIHRpcG8gZGUgZXhwcmVzacOzbiBxdWUgYWxndWllbiBoYSB1dGlsaXphZG8uDQorIEVsICoqZGlzY3Vyc28qKiBlcyBlbCBjb25vY2ltaWVudG8gc29icmUgdW5pZGFkZXMgbGluZ8O8w61zdGljYXMgbcOhcyBncmFuZGVzIHF1ZSB1biBzb2xvIGVudW5jaWFkby4gRXN0byBlcyDDunRpbCBwYXJhIHJlc29sdmVyIHJlZmVyZW5jaWFzIGNydXphZGFzIHBvciBlamVtcGxvLg0KDQoNCjwhLS0gIyMgKioxLjIuIExhIGZpbG9zb2bDrWEgZGVsIGxlbmd1YWplKiogLS0+DQoNCjwhLS0gRXhpc3RlbiBjdWF0cm8gcHJvYmxlbWFzIGZpbG9zw7NmaWNvcyBkZWwgbGVuZ3VhamU6IC0tPg0KDQo8IS0tICMjIyAqKkxhIG5hdHVyYWxlemEgZGVsIHNpZ25pZmljYWRvIGVuIGVsIGxlbmd1YWplKiogLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIDxjZW50ZXI+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDFfTmF0dXJhbGV6YVNpZ25pZmljYWRvLmpwZyI+PC9jZW50ZXI+IC0tPg0KDQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSArIExhIG5hdHVyYWxlemEgZGVsIHNpZ25pZmljYWRvIGVuIGVsIGxlbmd1YWplIHNlIHByZW9jdXBhIGRlIGxhIHNlbcOhbnRpY2EgZGUgdW4gbGVuZ3VhamUgeSBsYSBuYXR1cmFsZXphIGRlbCBzaWduaWZpY2FkbyBlbiBzw60uICAtLT4NCjwhLS0gKyBGaWzDs3NvZm9zIHkgbGluZ8O8aXN0YXMgaW50ZW50YW4gZW5jb250cmFyIHF1w6kgc2lnbmlmaWNhICoqKnNpZ25pZmljYXIqKiosIGPDs21vIGVsIHNpZ25pZmljYWRvIGRlIHVuYSBwYWxhYnJhIHUgb3JhY2nDs24gc2Ugb3JpZ2luYSB5IGPDs21vIHNlIGhhIGZvcm1hZG8uIC0tPg0KPCEtLSArIMK/Q8OzbW8gbGFzIHBhbGFicmFzIGZvcm1hcm9uIHJlbGFjaW9uZXMgeSBwb3IgcXXDqSBhcGFyZWNlbiBsb3Mgc2luw7NuaW1vcz8gLS0+DQo8IS0tICsgwr9Dw7NtbyBsYXMgcGFsYWJyYXMsIGNvbiBzdXMgcHJvcGlvcyBzaWduaWZpY2Fkb3Mgc2UgdW5lbiBwYXJhIGZvcm1hciBvcmFjaW9uZXMgY29uIHN1IHByb3BpbyBzaWduaWZpY2Fkbz8gLS0+DQo8IS0tICsgRXN0byBzZSBwdWVkZSByZXByZXNlbnRhciB5IGFuYWxpemFyIGRlIGRpdmVyc2FzIG1hbmVyYXM6IGVtaXNvcmVzIHkgcmVjZXB0b3Jlcywgw6FyYm9sZXMgc2ludMOhY3RpY2FzIChwYXJzZSB0cmVlcykuIC0tPg0KDQo8IS0tICMjIyAqKkVsIHVzbyBkZWwgbGVuZ3VhamUqKiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gPGNlbnRlcj48aW1nIHdpZHRoPSI4MCUiIHNyYz0iZmlncy8wMV9BY3RvSGFibGEuanBnIj48L2NlbnRlcj4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tICsgU2UgcHJlb2N1cGEgZGUgY8OzbW8gZWwgbGVuZ3VhamUgZXMgdXNhZG8gZW4gdmFyaW9zIGVzY2VuYXJpb3MgeSB0aXBvcyBkZSBjb211bmljYWNpw7NuIGVudHJlIHNlcmVzIGh1bWFub3MuIC0tPg0KPCEtLSArIEluY2x1eWUgZWwgZXN0dWRpbyBkZSBsYSBpbnRlbmNpw7NuLCBlbCB0b25vLCBlbCBjb250ZW5pZG8geSBsYXMgYWNjaW9uZXMgZW52dWVsdGFzIGVuIGxhIGV4cHJlc2nDs24gZGUgdW4gbWVuc2FqZSAoYWN0byBkZWwgaGFibGEgbyAqc3BlZWNoIGFjdCopLiAtLT4NCjwhLS0gKyBDb25jZXB0b3MgbcOhcyBhdmFuemFkb3Mgc2UgcmVsYWNpb25hbiBhbCBvcmlnZW4gZGUgbGEgY3JlYWNpw7NuIGRlbCBsZW5ndWFqZSB5IGxhcyBhY3RpdmlkYWRlcyBjb2duaXRpdmFzIGh1bWFuYXMsIHJlc3BvbnNhYmxlcyBkZSBsYSBhZHF1aXNpY2nDs24geSB1c28gZGVsIGxlbmd1YWplLiAtLT4NCg0KPCEtLSAjIyMgKipMYSBjb2duaWNpw7NuIGRlbCBsZW5ndWFqZSoqIC0tPg0KDQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSA8Y2VudGVyPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX0NvZ25pY2lvbi5qcGciPjwvY2VudGVyPiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gKyBTZSBjZW50cmEgZW4gY8OzbW8gbGFzIGZ1bmNpb25lcyBjb2duaXRpdmFzIGRlbCBjZXJlYnJvIGh1bWFubyBzb24gcmVzcG9uc2FibGVzIGRlIGVudGVuZGVyIGUgaW50ZXJwcmV0YXIgZWwgbGVuZ3VhamUuIC0tPg0KPCEtLSArIExhIGNvZ25pY2nDs24gaW50ZW50YSBlbmNvbnRyYXIgY8OzbW8gbGEgbWVudGUgdHJhYmFqYSBhbCBjb21iaW5hciB5IHJlbGFjaW9uYXIgcGFsYWJyYXMgZXNwZWPDrWZpY2FzIGVuIG9yYWNpb25lcyB5IHVuIG1lbnNhamUgY29uIHNpZ25pZmljYWRvLiAtLT4NCg0KPCEtLSAjIyMgKipMYSByZWxhY2nDs24gZW50cmUgZWwgbGVuZ3VhamUgeSBsYSByZWFsaWRhZCoqIC0tPg0KDQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSA8Y2VudGVyPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX1RyaWFuZ3Vsb1NlbWlvdGljby5qcGciPjwvY2VudGVyPiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gKyBFeHBsb3JhIGxhIGV4dGVuc2nDs24gZGUgdmVyb3NpbWlsaXR1ZCBkZSBsYXMgZXhwcmVzaW9uZXMgcXVlIHNlIG9yaWdpbmFuIGVuIGVsIGxlbmd1YWplLiAtLT4NCjwhLS0gKyBMb3MgZmlsw7Nzb2ZvcyBidXNjYW4gbWVkaXIgcXXDqSB0YW50byByZXByZXNlbnRhbiBlc3RhcyBleHByZXNpb25lcyBsb3MgaGVjaG9zLiAtLT4NCjwhLS0gKyBTZSByZWxhY2lvbmEgbGFzIGV4cHJlc2lvbmVzIGNvbiBsbyBxdWUgc3VjZWRlIGVuIGVsIG11bmRvLiAtLT4NCjwhLS0gKyBUYWxlcyByZWxhY2lvbmVzIHB1ZWRlbiBzZXIgZXhwcmVzYWRhcyBkZSBtdWNoYXMgbWFuZXJhcy4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIDxjZW50ZXI+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDFfRGlyZWN0aW9uT2ZGaXQucG5nIj48L2NlbnRlcj4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tICMjICoqMS4zLiBBZHF1aXNpY2nDs24gZGVsIGxlbmd1YWplKiogLS0+DQoNCjwhLS0gRXN0YSBzZSBkZWZpbmUgY29tbyBlbCBwcm9jZXNvIGEgdHJhdsOpcyBkZWwgY3VhbCBlbCBzZXIgaHVtYW5vIHV0aWxpemEgc3VzIGhhYmlsaWRhZGVzIGNvZ25pdGl2YXMsIGNvbm9jaW1pZW50byB5IGV4cGVyaWVuY2lhIHBhcmEgZW50ZW5kZXIgZWwgbGVuZ3VhamUgZW4gYmFzZSBhIGVzY3VjaGFyIHkgcGVyY2liaXIgcGFsYWJyYXMgeSBvcmFjaW9uZXMgcGFyYSBjb211bmljYXJzZSBjb24gb3Ryb3MuIC0tPg0KDQo8IS0tIEV4aXN0ZW4gdmFyaWFzIHRlb3LDrWFzIGFjZXJjYSBkZSBsYSBhZHF1aXNpY2nDs24gZGVsIGxlbmd1YWplOiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gPGNlbnRlcj48aW1nIHdpZHRoPSI4MCUiIHNyYz0iZmlncy8wMV9BZHF1aXNpY2lvbi5qcGciPjwvY2VudGVyPiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gKyAqKlByaW1lcm9zIGZpbMOzc29mb3MqKjogSGFiaWxpZGFkIG90b3JnYWRhIHBvciBEaW9zLiAtLT4NCjwhLS0gKyAqKlBsYXTDs24qKjogTWFwZW8gcGFsYWJyYS1zaWduaWZpY2Fkby4gLS0+DQo8IS0tICsgKipCLiBTa2lubmVyKio6IFJlZnVlcnpvIGRlIGxhIG1lbW9yaWEgYW50ZSBlc3TDrW11bG9zIChhY29uZGljaW9uYW1pZW50byBpbnN0cnVtZW50YWwgdSBvcGVyYXRpdm8pLiAtLT4NCjwhLS0gKyAqKk4uIENob21za3kqKjogQXByZW5kaXphamUgc3VnZXJpZG8gcG9yIFNraW5uZXIgbcOhcyBpbmZlcmVuY2lhIGRlIHJlZ2xhcyBkZSBzaW50YXhpcywgc2Vtw6FudGljYSwgY29uY2VwdG9zIHkgZ3JhbcOhdGljYS4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tICMjICoqMS40LiBVc28gZGVsIGxlbmd1YWplKiogLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIDxjZW50ZXI+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDFfVXNvTGVuZ3VhamUuanBnIj48L2NlbnRlcj4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIFNlIGhhYmxhIGRlIGNvbmNlcHRvcyByZWxhY2lvbmFkb3MgYSBsb3MgImFjdG9zIGRlbCBoYWJsYSIgcXVlIGRlZmluZW4gY29tbyB1biBsZW5ndWFqZSBlcyB1c2FkbyBlbiBsYSBjb211bmljYWNpw7NuLiAtLT4NCg0KPCEtLSBFeGlzdGVuIDMgY2F0ZWdvcsOtYXMgZGUgImFjdG9zIGRlbCBoYWJsYSI6IC0tPg0KDQo8IS0tICsgKipMb2N1dGl2YSoqOiBFbWlzacOzbiB5IGVudHJlZ2EgZGVsIG1lbnNhamUuIC0tPg0KPCEtLSArICoqSWxvY3V0aXZhKio6IFNlbcOhbnRpY2EgeSBzaWduaWZpY2FkbyBkZWwgbWVuc2FqZS4gLS0+DQo8IS0tICsgKipQZXJsb2N1dGl2YSoqOiBFZmVjdG9zIGRlbCBtZW5zYWplIGVuIHN1IHJlY2VwdG9yLiAtLT4NCg0KPCEtLSBFeGlzdGVuIDUgY2xhc2VzIGRpc3RpbnRhcyBkZSBhY3RvcyAqaWxvY3V0aXZvcyo6IC0tPg0KDQo8IS0tICsgKipBc2VydGl2byoqOiBQcm9wb3NpY2nDs24gcXVlIHB1ZWRlIHNlciB2ZXJkYWRlcmEgbyBmYWxzYS4gLS0+DQo8IS0tICsgKipEaXJlY3Rpdm8qKjogUHJlZ3VudGEgbyBkaXJlY2Npw7NuIGRlIHJlYWxpemFyIGFsZ3VuYSBhY3RpdmlkYWQuIC0tPg0KPCEtLSArICoqQ29taXNpdm8qKjogQ29tcHJvbWlzbyBkZWwgZW1pc29yIGRlIHJlYWxpemFyIGFsZ8O6biBhY3RvIHZvbHVudGFyaW8uIC0tPg0KPCEtLSArICoqRXhwcmVzaXZvKio6IERpc3Bvc2ljacOzbiB1IG9waW5pw7NuIGhhY2lhIHVuYSBwcm9wb3NpY2nDs24gcGFydGljdWxhci4gLS0+DQo8IS0tICsgKipEZWNsYXJhY2nDs24qKjogQWN0byBkZWwgaGFibGEgY2FwYXogZGUgY2FtYmlhciBsYSByZWFsaWRhZCBlbiBiYXNlIGEgbGEgcHJvcG9zaWNpw7NuIGRlY2xhcmFkYS4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tICMjICoqMS40LiBMaW5nw7zDrXN0aWNhKiogLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KPCEtLSA8Y2VudGVyPjxhIGhyZWY9Imh0dHBzOi8vY2VzYXJhZ3VpbGFyLndlZWJseS5jb20vaW50cm9kdWNjaW9hY3V0ZW4tYS1sYS1saW5ndXVtbGlhY3V0ZXN0aWNhLWNvbXB1dGFjaW9uYWwuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPiAtLT4NCjwhLS0gPGltZyBzcmM9ImZpZ3MvMDFfUmFtYXNMaW5ndWlzdGljYS5wbmciIHdpZHRoPSI3NTAiIGhlaWdodD0iNTAwIiBib3JkZXI9IjEwIi8+PC9hPjxwIGNsYXNzPSJjYXB0aW9uIj5Dw6lzYXIgQWd1aWxhciwgTGluZ8O8w61zdGljYSBDb21wdXRhY2lvbmFsLCBjbGljayBlbiBsYSBpbWFnZW4uPC9wPjwvY2VudGVyPiAtLT4NCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIFNlIGRlZmluZSBjb21vIGVsIGVzdHVkaW8gY2llbnTDrWZpY28gZGVsIGxlbmd1YWplLCBpbmNsdXllbmRvIGZvcm1hLCBzaW50YXhpcywgc2lnbmlmaWNhZG8geSBzZW3DoW50aWNhLiAtLT4NCg0KPCEtLSBQYXJhIGVsIGFuw6FsaXNpcyBkZSB0ZXh0byBlcyDDunRpbCBjb25vY2VyIGFsZ3VuYXMgw6FyZWFzIGRlIGxhIGxpbmfDvMOtc3RpY2EgeWEgcXVlIHNvbiB1c2FkYXMgZW4gdmFyaW9zIGFsZ29yaXRtb3MuIFNpbiBlbWJhcmdvIGVzIHByZWNpc28gbm8gb2x2aWRhciBxdWUgZXN0ZSBjYW1wbyBlcyBhbXBsaW8geSB2YSBtdWNoYSBtw6FzIGFsbMOhIGRlIG51ZXN0cm8gYW7DoWxpc2lzOiAtLT4NCg0KPCEtLSArICoqRm9uw6l0aWNhOioqIEVzIGVsIGVzdHVkaW8gZGUgbGFzIHByb3BpZWRhZGVzIGFjw7pzdGljYXMgZGUgbG9zIHNvbmlkb3MgcHJvZHVjaWRvcyBwb3IgbGEgdm96IGh1bWFuYSBkdXJhbnRlIGVsIGhhYmxhLiAtLT4NCjwhLS0gKyAqKkZvbm9sb2fDrWE6KiogRXN0dWRpbyBkZSBsb3MgcGF0cm9uZXMgZGUgc29uaWRvIG1pZW50cmFzIHNvbiBpbnRlcnByZXRhZG9zIGVuIGxhIG1lbnRlIGh1bWFuYSBwYXJhIGRpc3Rpbmd1aXIgZW50ZSBkaXN0aW50b3MgZm9uZW1hcy4gRXN0dWRpYSBhZGVtw6FzIGxvcyBhY2VudG9zLCB0b25vcyB5IGVzdHJ1Y3R1cmEgZGUgbGFzIHPDrWxhYmFzLiAtLT4NCjwhLS0gICArICpGb25lbWE6KiBFcyBsYSBhcnRpY3VsYWNpw7NuIG3DrW5pbWEgZGUgdW4gc29uaWRvLiBFeGlzdGVuIGFsIG1lbm9zIDIyIGVuIGVsIGVzcGHDsW9sIHkgNDUgZW4gZWwgaW5nbMOpcyAoaHR0cHM6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvRm9uZW1hKS4gLS0+DQo8IS0tICsgKipTaW50YXhpczoqKiBFc3R1ZGlvIGRlIGxhcyBvcmFjaW9uZXMsIGZyYXNlcywgcGFsYWJyYXMgeSBzdXMgZXN0cnVjdHVyYXMgKGZyYXNlIHkgb3JhY2nDs24gc2UgZGlmZXJlbmNpYW4gZW4gZWwgdXNvIGRlbCB2ZXJibyBlbiBmb3JtYSBwZXJzb25hbCkuICpFbCBjYW1iaW8gZGUgb3JkZW4gZGUgbGFzIHBhbGFicmFzIHBvZHLDrWEgY2FtYmlhciBlbCBzZW50aWRvIGRlIGxhIG9yYWNpw7NuKiAqKip0b3RhbG1lbnRlKioqLiAtLT4NCjwhLS0gKyAqKlNlbcOhbnRpY2E6KiogRXN0dWRpbyBkZWwgc2lnbmlmaWNhZG8sIGRpdmlkaWRhIGVuIHNlbcOhbnRpY2EgbMOpeGljYSB5IGNvbXBvc2ljaW9uYWwuIC0tPg0KPCEtLSAgICsgKlNlbcOhbnRpY2EgbMOpeGljYToqIEVzdHVkaW8gZGVsIHNpZ25pZmljYWRvIGRlIGxhcyBwYWxhYnJhcyB5IHPDrW1ib2xvcyB1c2FuZG8gbW9yZm9sb2fDrWEgeSBzaW50YXhpcyAocmVsYWNpb25lcyBzaW1wbGVzKS4gLS0+DQo8IS0tICAgKyAqU2Vtw6FudGljYSBjb21wb3NpY2lvbmFsOiogRXN0dWRpbyBkZSBsYXMgcmVsYWNpb25lcyBlbnRyZSBwYWxhYnJhcyB5IGNvbWJpbmFjaW9uZXMgZGUgcGFsYWJyYXMgcGFyYSBlbnRlbmRlciBlbCBzaWduaWZpY2FkbyBkZSBmcmFzZXMgeSBvcmFjaW9uZXMgKHJlbGFjaW9uZXMgY29tcGxlamFzKS4gLS0+DQo8IS0tICsgKipNb3Jmb2xvZ8OtYToqKiBFc3R1ZGlvIGRlIGxhIGVzdHJ1Y3R1cmEgeSBzaWduaWZpY2FkbyBkZSBsb3MgbW9yZmVtYXMuIExvcyBtb3JmZW1hcyBzb24gbGEgdW5pZGFkIG3DoXMgcGVxdWXDsWEgZGVsIGxlbmd1YWplIHF1ZSB0aWVuZSB1biBzaWduaWZpY2Fkby4gLS0+DQo8IS0tICsgKipMw6l4aWNvOioqIEVzdHVkaW8gZGUgbGFzIHByb3BpZWRhZGVzIGRlIGxhIHBhbGFicmFzIHkgZnJhc2VzIHVzYWRhcyBlbiB1biBsZW5ndWFqZSB5IGNvbW8gY29uc3RydXllbiBlbCB2b2NhYnVsYXJpby4gLS0+DQo8IS0tICsgKipQcmFnbcOhdGljYToqKiBFc3R1ZGlvIGRlIGPDs21vIGZhY3RvcmVzIGxpbmfDvMOtc3RpY29zIHkgbm8gbGluZ8O8w61zdGljb3MgYWZlY3RhbiBlbCBzaWduaWZpY2FkbyBkZSB1biBtZW5zYWplLiAtLT4NCjwhLS0gKyAqKkFuw6FsaXNpcyBkZWwgZGlzY3Vyc286KiogQW5hbGl6YSBlbCBsZW5ndWFqZSB5IGVsIGludGVyY2FtYmlvIGRlIGluZm9ybWFjacOzbiBhIG1vZG8gZGUgb3JhY2lvbmVzIGVuIGNvbnZlcnNhY2lvbmVzLiBFc3RhcyBjb252ZXJzYWNpb25lcyBwdWVkZW4gc2VyIGVzY3JpdGFzLCBoYWJsYWRhcyBvIGVuIHNlw7Fhcy4gLS0+DQo8IS0tICsgKipFc3RpbMOtc3RpY2E6KiogRXN0dWRpYSBlbCBsZW5ndWFqZSBjZW50csOhbmRvc2UgZW4gZWwgZXN0aWxvIGRlIGVzY3JpdHVyYSB5IHRvZG8gbG8gcXVlIGVsbG8gY29ubGxldmEuIC0tPg0KPCEtLSArICoqU2VtacOzdGljYToqKiBFc3R1ZGlhIGxvcyBzaWdub3MsIHPDrW1ib2xvcyB5IHByb2Nlc29zIGRlIHNlw7FhbGVzIHkgY8OzbW8gY29tdW5pY2FuIHNpZ25pZmljYWRvcy4gQ29zYXMgY29tbyBsb3Mgc2ltYm9saXNtb3MsIGFuYWxvZ8OtYXMgeSBtZXTDoWZvcmFzIHNvbiBjdWJpZXJ0YXMgcG9yIGVzdGEgw6FyZWEuIC0tPg0KDQo8IS0tIDxicj48L2JyPiAtLT4NCjwhLS0gPGNlbnRlcj48YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL0xlbmluL3N0YXR1cy8xMjgwMjM2MTQzNTc4MTU3MDU2P3JlZl9zcmM9dHdzcmMlNUVnb29nbGUlN0N0d2NhbXAlNUVzZXJwJTdDdHdnciU1RXR3ZWV0IiB0YXJnZXQ9Il9ibGFuayI+IC0tPg0KPCEtLSA8aW1nIHNyYz0iZmlncy8wMV9Nb3Jlbm8ucG5nIiB3aWR0aD0iNzUwIiBoZWlnaHQ9IjUwMCIgYm9yZGVyPSIxMCIvPjwvYT48cCBjbGFzcz0iY2FwdGlvbiI+VHdlZXQgZGUgTGVuw61uIE1vcmVubywgY2xpY2sgZW4gbGEgaW1hZ2VuLjwvcD48L2NlbnRlcj4gLS0+DQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSBgYGB7cn0gLS0+DQo8IS0tIE1vcmVub3R3ZWV0ID0gJ8KhRW4gdW4gbW9tZW50byBjcsOtdGljbywgbG9ncmFtb3MgdW4gYWN1ZXJkbyBoaXN0w7NyaWNvIGNvbiBsb3MgbcOhcyBpbXBvcnRhbnRlcyB0ZW5lZG9yZXMgZGUgbGEgZGV1ZGEgcXVlIG5vcyBwZXJtaXRpcsOhIGxpYmVyYXIgVVMkMTYuMDAwIG1pbGxvbmVzIGRlIHBhZ28gZGUgbGEgZGV1ZGEgZW4gbG9zIHByw7N4aW1vcyAxMCBhw7FvcyEgI0p1bnRvc0VjdWFkb3InIC0tPg0KPCEtLSBgYGAgLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KPCEtLSA8Y2VudGVyPjxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vTGFzc29HdWlsbGVybW8vc3RhdHVzLzEyNzk5NzY2Mzc2Nzc5Mjg0NTQ/cmVmX3NyYz10d3NyYyU1RWdvb2dsZSU3Q3R3Y2FtcCU1RXNlcnAlN0N0d2dyJTVFdHdlZXQiIHRhcmdldD0iX2JsYW5rIj4gLS0+DQo8IS0tIDxpbWcgc3JjPSJmaWdzLzAxX0xhc3NvLnBuZyIgd2lkdGg9Ijc1MCIgaGVpZ2h0PSI1MDAiIGJvcmRlcj0iMTAiLz48L2E+PHAgY2xhc3M9ImNhcHRpb24iPlR3ZWV0IGRlIEd1aWxsZXJtbyBMYXNzbywgY2xpY2sgZW4gbGEgaW1hZ2VuLjwvcD48L2NlbnRlcj4gLS0+DQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSBgYGB7cn0gLS0+DQo8IS0tIExhc3NvVHdlZXQgPSAnR3JhbiBlbnRyZXZpc3RhIGVuIEBDYW5hbFVub1R2IGNvbiBSYWZhZWwgQ3Vlc3RhLiBNdWNoYXMgZ3JhY2lhcyBwb3IgcmVjaWJpcm1lIHkgYWJyaXIgdW4gZXNwYWNpbyBwYXJhIGNvbnZlcnNhciBzb2JyZSBsYXMgcHJlb2N1cGFjaW9uZXMgZGUgbG9zIGVjdWF0b3JpYW5vcyBjb24gbWlyYXMgYWwgMjAyMS4gVmFtb3MgYSBzYWx2YXIgYWwgRWN1YWRvciDwn5Kq8J+PvPCfh6rwn4eoLicgLS0+DQo8IS0tIGBgYCAtLT4NCg0KPCEtLSAjIyAqKjEuNS4gU2ludGF4aXMgeSBlc3RydWN0dXJhIGRlbCBsZW5ndWFqZSoqIC0tPg0KDQo8IS0tIEVsIGNvbm9jZXIgbGEgZXN0cnVjdHVyYSB5IGxhIHNpbnRheGlzIGRlbCBsZW5ndWFqZSBlcyDDunRpbCBwYXJhIGVsIHByb2Nlc2FtaWVudG8gZGUgdGV4dG8sIHJlYWxpemFyIGFub3RhY2lvbmVzIHkgYW7DoWxpc2lzIHNpbnTDoWN0aWNvLCBxdWUgbHVlZ28gc2Vyw6FuIHVzYWRvcyBlbiBsYSBjbGFzaWZpY2FjacOzbiB5IHJlc3VtZW4gZGVsIHRleHRvLiAtLT4NCg0KPCEtLSBFbiBlbCBlc3Bhw7FvbCBsYXMgcGFsYWJyYXMgc2UgdW5lbiBwYXJhIGZvcm1hciB1bmlkYWRlcyBjb25zdGl0dXllbnRlcyBkZSBsYSBlc3RydWN0dXJhIGplcsOhcnF1aWNhIGRlIGxhIG9yYWNpw7NuLiAtLT4NCg0KPCEtLSAjIyMgKipFc3RydWN0dXJhIGplcsOhcnF1aWNhIGRlIGxhIG9yYWNpw7NuKiogLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KPCEtLSA8Y2VudGVyPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX0VzdHJ1Y3R1cmFKZXJhcnF1aWNhT3JhY2lvbi5wbmciPjwvY2VudGVyPiAtLT4NCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIExvcyBub2RvcyBzZSBjb21wb25lbiBkZSBsYSB1bmlkYWQgbcOhcyBwZXF1ZcOxYSBkZSBsYSBvcmFjacOzbiAocGFsYWJyYSwgc8OtbWJvbG9zIHRlcm1pbmFsZXMpLCBzdXMgY29tYmluYWNpb25lcyBmb3JtYW4gc2ludGFnbWFzIChmcmFzZXMsIHPDrW1ib2xvcyBubyB0ZXJtaW5hbGVzKSB5IHN1IHVuacOzbiBmaW5hbDsgbGEgb3JhY2nDs24gKHF1ZSBwdWVkZSBzZXIgc2ltcGxlIG8gY29tcGxlamEpLiBFc3RhcyBvcmFjaW9uZXMgYWRlbcOhcyBwdWVkZW4gc2VyIGNvbWJpbmFkYXMgcGFyYSBmb3JtYXIgdGV4dG9zICh2aXNpdGEgZWwgbGluayBhIHVuIFthbmFsaXphZG9yIHNpbnTDoWN0aWNvXShodHRwczovL3NpbnRheGlzLm9yZy9hbmFsaXphZG9yLykgbyBhbCBvdHJvIFthbmFsaXphZG9yIHNpbnTDoWN0aWNvXShodHRwczovL3d3dy5teXN0aWx1cy5jb20vaGVycmFtaWVudGFzL2FuYWxpemFkb3ItbW9yZm9zaW50YWN0aWNvKSkuIC0tPg0KDQo8IS0tIDxicj48L2JyPiAtLT4NCjwhLS0gPGNlbnRlcj48aW1nIHdpZHRoPSI4MCUiIHNyYz0iRmlncy8wMV9BbmFsaXNpc1NpbnRhY3RpY29Nb3Jlbm8ucG5nIj48cCBjbGFzcz0iY2FwdGlvbiI+VHdlZXQgZGUgTGVuw61uIE1vcmVubywgYW7DoWxpc2lzIHNpbnTDoWN0aWNvLjwvcD48L2NlbnRlcj4gLS0+DQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQo8IS0tIDxjZW50ZXI+PGltZyB3aWR0aD0iODAlIiBzcmM9IkZpZ3MvMDFfQW5hbGlzaXNTaW50YWN0aWNvTGFzc28ucG5nIj48cCBjbGFzcz0iY2FwdGlvbiI+VHdlZXQgZGUgR3VpbGxlcm1vIExhc3NvLCBhbsOhbGlzaXMgc2ludMOhY3RpY28uPC9wPjwvY2VudGVyPiAtLT4NCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIFkgZW4gUiB1dGlsaXphcmVtb3MgcGFyYSBlamVtcGxpZmljYXIsIHVuIG1vZGVsbyBlbnRyZW5hZG8gcG9yIFtVRFBpcGUsIGRlIGxhIEZhY3VsdGFkIGRlIE1hdGVtw6F0aWNhcyB5IEbDrXNpY2EgZGUgbGEgVW5pdmVyc2lkYWQgZGUgUmVww7pibGljYSBDaGVjYV0oaHR0cDovL3VmYWwubWZmLmN1bmkuY3ovdWRwaXBlKTogLS0+DQoNCjwhLS0gYGBge3J9IC0tPg0KPCEtLSAjIENhcmdhIHLDoXBpZGEgZGUgbGlicmVyw61hcyAtLT4NCjwhLS0gbGlicmFyeSh1ZHBpcGUpIC0tPg0KPCEtLSBsaWJyYXJ5KHRpZHl2ZXJzZSkgLS0+DQo8IS0tIGBgYCAtLT4NCg0KDQo8IS0tIGBgYHtyfSAtLT4NCjwhLS0gIyBEZXNjYXJnYSBkZSBtb2RlbG8gcHJlZW50cmVuYWRvIHVkcGlwZSAgLS0+DQo8IS0tICN1ZHBpcGU6OnVkcGlwZV9kb3dubG9hZF9tb2RlbCgnc3BhbmlzaCcpICMgRGVzY29tZW50YXIgYWwgZWplY3V0YXIgcG9yIHByaW1lcmEgdmV6IC0tPg0KPCEtLSBgYGAgLS0+DQoNCjwhLS0gVHdlZXQgZGUgR3VpbGxlcm1vIExhc3NvIGNvbiBhbm90YWNpb25lczogLS0+DQoNCjwhLS0gYGBge3J9IC0tPg0KPCEtLSAjIEVqZW1wbG8gZGUgZXRpcXVldGFkbyBQT1MgKHR3ZWV0IGRlIExhc3NvKSAtLT4NCjwhLS0gbGlicmFyeShzdHJpbmdpKSAtLT4NCjwhLS0gbW9kZWwgPSB1ZHBpcGVfbG9hZF9tb2RlbChmaWxlID0gInNwYW5pc2gtZ3NkLXVkLTIuNC0xOTA1MzEudWRwaXBlIikgLS0+DQo8IS0tIExhc3NvVHdlZXRfYW5ub3RhdGVkID0gdWRwaXBlX2Fubm90YXRlKG1vZGVsLCB4ID0gc3RyaV9lbmNfdG91dGY4KExhc3NvVHdlZXQpKSAtLT4NCjwhLS0gTGFzc29Ud2VldF9hbm5vdGF0ZWQgPSBhc190aWJibGUoTGFzc29Ud2VldF9hbm5vdGF0ZWQsIGVuY29kaW5nPSJsYXRpbi0xIikgLS0+DQo8IS0tIExhc3NvVHdlZXRfYW5ub3RhdGVkWywgYygidG9rZW4iLCJsZW1tYSIsInVwb3MiKV0gLS0+DQo8IS0tIGBgYCAtLT4NCg0KPCEtLSBUd2VldCBkZSBMZW5pbiBNb3Jlbm8gY29uIGFub3RhY2lvbmVzOiAtLT4NCg0KPCEtLSBgYGB7cn0gLS0+DQo8IS0tICMgRWplbXBsbyBkZSBldGlxdWV0YWRvIFBPUyAodHdlZXQgZGUgTGVubmluKSAtLT4NCjwhLS0gTW9yZW5vdHdlZXRfYW5ub3RhdGVkID0gdWRwaXBlX2Fubm90YXRlKG1vZGVsLCB4ID0gc3RyaV9lbmNfdG91dGY4KE1vcmVub3R3ZWV0KSkgLS0+DQo8IS0tIE1vcmVub3R3ZWV0X2Fubm90YXRlZCA9IGFzX3RpYmJsZShNb3Jlbm90d2VldF9hbm5vdGF0ZWQpIC0tPg0KPCEtLSBNb3Jlbm90d2VldF9hbm5vdGF0ZWRbLCBjKCJ0b2tlbiIsImxlbW1hIiwidXBvcyIpXSAtLT4NCjwhLS0gYGBgIC0tPg0KDQo8IS0tICMjIyAqKlBhbGFicmFzKiogLS0+DQoNCjwhLS0gU29uIGxhIHVuaWRhZCBtw6FzIHBlcXVlw7FhIGRlbCBsZW5ndWFqZSwgc29uIGluZGVwZW5kaWVudGVzIHkgdGllbmVuIHN1IHByb3BpbyBzaWduaWZpY2Fkby4gTG9zIG1vcmZlbWFzIGVuIGNhbWJpbyBubyBzb24gaW5kZXBlbmRpZW50ZXMuIEVsIG1vcmZlbWEgZXMgbGEgcGFydGUgZGUgbGEgcGFsYWJyYSAgcXVlIHZhcsOtYS4gLS0+DQoNCjwhLS0gUG9yIGxvIGdlbmVyYWwgZXMgw7p0aWwgZXRpcXVldGFyIGxhcyBwYWxhYnJhcyB5IGFuYWxpemFybGFzIGNvbW8gKiJwYXJ0ZXMgZGVsIGhhYmxhIiogKGV0aXF1ZXRhZG8gKipQT1MqKiwgcGFydHMgb2Ygc3BlZWNoKS4gRXN0YXMgZXRpcXVldGFzIHNvbjogLS0+DQoNCjwhLS0gKyAqU3VzdGFudGl2byAoTiwgbm91bikqIC0tPg0KPCEtLSArICpWZXJibyAoViwgdmVyYikqIC0tPg0KPCEtLSArICpBZGpldGl2byAoQWRqLCBhZGplY3RpdmUpKiAtLT4NCjwhLS0gKyAqQWR2ZXJiaW8gKEFkdiwgYWR2ZXJiKSogLS0+DQoNCjwhLS0gQ2FkYSB1bmEgZGUgZXN0YXMgcHVlZGUgc2VyIHN1YmRpdmlkaWRhIHNlZ8O6biBlbCBsZW5ndWFqZSBhbmFsaXphZG8gKFtTdGFuZm9yZCBOTFAgRkFRXShodHRwczovL25scC5zdGFuZm9yZC5lZHUvc29mdHdhcmUvc3BhbmlzaC1mYXEuc2h0bWwjdGFnc2V0KSkuIC0tPg0KDQo8IS0tICMjIyAqKlNpbnRhZ21hcyoqIC0tPg0KDQo8IS0tICsgRWwgc2ludGFnbWEgbm9taW5hbCAoU04sIE5QKSBlcyBhcXVlbCBxdWUgZXN0w6EgY29uc3RpdHVpZG8gYWxyZWRlZG9yIGRlIHVuIHN1c3RhbnRpdm8gbyBwcm9ub21icmUuICpMYSBtYWRyZS4qIC0tPg0KPCEtLSArIEVsIHNpbnRhZ21hIHZlcmJhbCAoU1YsIFZQKSBlcyBhcXVlbCBjdXlvIG7DumNsZW8gZXN0w6EgY29tcHVlc3RvIHBvciB1bmEgZm9ybWEgdmVyYmFsLiAqQ29tcHLDsyB1biBsaWJyby4qIC0tPg0KPCEtLSArIEVsIHNpbnRhZ21hIHByZXBvc2ljaW9uYWwgKFNQLCBQUCkgZXMgYXF1ZWwgcXVlIGVzdMOhIGZvcm1hZG8gcG9yIHVuIHByZXBvc2ljacOzbiB5IHVuIHTDqXJtaW5vIGN1eW8gbsO6Y2xlbyBwdWVkZSBzZXIgdW4gc3VzdGFudGl2bywgdW4gYWRqZXRpdm8gbyB1biBhZHZlcmJpby4gKkNvbiBzdSBsbGF2ZSogLS0+DQo8IS0tICsgRWwgc2ludGFnbWEgYWRqZXRpdm8gKFNBZGosIEFESlApIGVzIGFxdWVsIGN1eW8gbsO6Y2xlbyBlc3TDoSBjb21wdWVzdG8gcG9yIHVuIGFkamV0aXZvLiAqU29ycHJlbmRlbnRlbWVudGUgZsOhY2lsLiogLS0+DQo8IS0tICsgRWwgc2ludGFnbWEgYWR2ZXJiaWFsIChTQWR2LCBBRFZQKSBlcyBhcXVlbCBjdXlvIG7DumNsZW8gZXN0w6EgY29tcHVlc3RvIHBvciB1biBhZHZlcmJpby4gKkNlcmNhIGRlIHRvZG8uKiAtLT4NCg0KDQo8IS0tICMjICoqMS42LiBHcmFtw6F0aWNhKiogLS0+DQoNCjwhLS0gRXN0YSBjb25zaXN0ZSBlbiB1biBjb25qdW50byBkZSByZWdsYXMgdXNhZGFzIHBhcmEgZGV0ZXJtaW5hciBjw7NtbyBwb3NpY2lvbmFyIHBhbGFicmFzLCBmcmFzZXMgeSBjbMOhdXN1bGFzIGFsIG1vbWVudG8gZGUgY29uc3RydWlyIG9yYWNpb25lcyBwYXJhIGN1YWxxdWllciBsZW5ndWFqZSBuYXR1cmFsLiBBeXVkYSBhIGhhYmlsaXRhciB0YW50byBsYSBzaW50YXhpcyBjb21vIGxhIGVzdHJ1Y3R1cmEgZW4gZWwgbGVuZ3VhamUuIEFsZ3VuYXMgZGUgc3VzIGNhcmFjdGVyw61zdGljYXMgc29uOiAtLT4NCg0KPCEtLSArIExhIGdyYW3DoXRpY2Egbm8gc2UgbGltaXRhIHNvbG8gYWwgbGVuZ3VhamUgZXNjcml0bywgeWEgcXVlIG9wZXJhIHRhbWJpw6luIHZlcmJhbG1lbnRlLiAtLT4NCjwhLS0gKyBTdXMgcmVnbGFzIHB1ZWRlbiBzZXIgZXNwZWPDrWZpY2FzIGEgdW5hIHJlZ2nDs24sIGxlbmd1YWplIG8gZGlhbGVjdG8sIG8gYSBzdSB2ZXo7IHNlciBhbGdvIHVuaXZlcnNhbGVzIGNvbW8gZWwgbW9kZWxvIHN1amV0by12ZXJiby1vYmpldG8gKFNWTykuIC0tPg0KPCEtLSArIFN1IGV2b2x1Y2nDs24gc2UgYmFzYSBlbiBlbCB1c28gZGVsIGxlbmd1YWplIGEgdHJhdsOpcyBkZWwgdGllbXBvLiAtLT4NCg0KPCEtLSAjIyAqKjEuNy4gVGlwb2xvZ8OtYSBkZWwgb3JkZW4gZGUgbGFzIHBhbGFicmFzKiogLS0+DQoNCjwhLS0gTGEgdGlwb2xvZ8OtYSBjb21vIHBhcnRlIGRlIGxhIGxpbmfDvMOtc3RpY2EgZXMgdW4gY2FtcG8gcXVlIHRyYXRhIGRlIGNsYXNpZmljYXIgbG9zIGxlbmd1YWplcyBiYXPDoW5kb3NlIGVuIHN1IHNpbnRheGlzLCBlc3RydWN0dXJhIHkgZnVuY2lvbmFsaWRhZC4gVW5hIGRlIGxhIG1hbmVyYSBtw6FzIGNvbXVuZXMgZGUgY2xhc2lmaWNhciB1biBsZW5ndWFqZSBlcyBhIHRyYXbDqXMgZGVsIG9yZGVuIGRvbWluYW50ZSBkZSBzdXMgcGFsYWJyYXMsIGNvbm9jaWRvIGNvbW8gbGEgdGlwb2xvZ8OtYSBkZWwgb3JkZW4gZGUgbGFzIHBhbGFicmFzLiBSdXNlbGwgVG9tbGluIGVuIDE5ODYgc3VnZXLDrWEgZWwgc2lndWllbnRlIGFuw6FsaXNpczogLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KPCEtLSA8Y2VudGVyPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJGaWdzLzAxX1RpcG9sb2dpYU9yZGVuLnBuZyI+PC9jZW50ZXI+IC0tPg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gIyMgKioxLjguIFNlbcOhbnRpY2EqKiAtLT4NCg0KPCEtLSBFcyBlbCBlc3R1ZGlvIGRlbCBzaWduaWZpY2FkbyBlbiBlbCBsZW5ndWFqZSwgbGFzIHJlbGFjaW9uZXMgZW50cmUgcGFsYWJyYXMsIGZyYXNlcyB5IHPDrW1ib2xvczsgYXPDrSBjb21vIGVsIGNvbm9jaW1pZW50byBxdWUgcmVwcmVzZW50YW4uIC0tPg0KDQo8IS0tICsgQSBwYXJ0aXIgZGUgdW5hIHBhbGFicmEgc2UgcHVlZGVuIGFybWFyIHJlZGVzIHNlbcOhbnRpY2FzOiBodHRwczovL3d3dy5ub2RlYm94Lm5ldC9wZXJjZXB0aW9uLiAtLT4NCjwhLS0gKyBMYSBzZW3DoW50aWNhIHNlIHB1ZWRlIHJlcHJlc2VudGFyIGEgdHJhdsOpcyBkZSBsYSAqKmzDs2dpY2EgcHJvcG9zaWNpb25hbCoqIHkgbGEgKipsw7NnaWNhIGRlIHByaW1lciBvcmRlbioqIChGT0wpLCBlbiBlc3BlY2lhbCBjdWFuZG8gYW5hbGl6YW1vcyBtZW5zYWplcyBlc2NyaXRvcyBvIGhhYmxhZG9zIChsYSBwcmluY2lwYWwgZm9ybWEgZGUgY29tdW5pY2Fyc2UgZGVsIHNlciBodW1hbm8pLiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQo8IS0tIDxjZW50ZXI+IC0tPg0KPCEtLSA8aW1nIHNyYz0iZmlncy8wMV9GT0xFamVtcGxvLnBuZyIgd2lkdGg9Ijc1MCIgaGVpZ2h0PSI1MDAiIGJvcmRlcj0iMTAiLz48L2E+PHAgY2xhc3M9ImNhcHRpb24iPkzDs2dpY2EgZGUgcHJpbWVyIG9yZGVuLCBMaW5nw7zDrXN0aWNhIENvbXB1dGFjaW9uYWwuPC9wPjwvY2VudGVyPiAtLT4NCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIExhcyByZWxhY2lvbmVzIGzDqXhpY28tc2Vtw6FudGljYXMgcG9yIHN1IGxhZG8gc2UgcHJlb2N1cGFuIGRlIGlkZW50aWZpY2FyIGxhIHJlbGFjacOzbiBzZW3DoW50aWNhIGVudHJlIHVuaWRhZGVzIGRlbCBsw6l4aWNvIChtb3JmZW1hcykuIEFsZ3Vub3MgY29uY2VwdG9zIGNsYXZlIGRlIGxhcyByZWxhY2lvbmVzIGzDqXhpY28tc2Vtw6FudGljYXMgcXVlIGRlYmVtb3MgY29ub2NlciBzb246IC0tPg0KDQo8IS0tICsgKipMZW1hOioqIEVzIGxhIGZvcm1hIGNhbsOzbmljYSBkZSB1biBjb25qdW50byBkZSBwYWxhYnJhcy4gRXMgZGVjaXIgcXVlIGVzIHVzdWFsbWVudGUgbGEgZm9ybWEgYmFzZSBkZSBkaWNobyBjb25qdW50by4gLS0+DQo8IS0tICsgKipIb23Ds25pbW9zIChIb23Ds2dyYWZvcy1Ib23Ds2ZvbmFzKToqKiBTb24gcGFsYWJyYXMgcXVlIGNvbXBhcnRlbiBsYSBtaXNtYSBmb3JtYSBkZSBlc2NyaWJpciAoaG9tw7NncmFmb3MpIG8gcHJvbnVuY2lhciAoaG9tw7NuaW1hcykgcGVybyBzaWduaWZpY2FuIGNvc2FzIGRpc3RpbnRhcy4gTGFzIHBhbGFicmFzIGhvbcOzZm9uYXMgc29uIGVuIGdlbmVyYWwgdW4gZ3JhbiBwcm9ibGVtYSBwYXJhIGVsIE5MUC4gLS0+DQo8IS0tICsgKipQb2xpc2VtYXM6KiogU29uIHBhbGFicmFzIHF1ZSBzZSBlc2NyaWJlbiBpZ3VhbCBwZXJvIHRpZW5lbiBzaWduaWZpY2Fkb3MgZGlzdGludG9zLCBhdW5xdWUgcmVsYWNpb25hZG9zIHNlZ8O6biBzdSBjb250ZXh0by4gLS0+DQo8IS0tICsgKipDYXBpdMOzbmltb3M6KiogU29uIHBhbGFicmFzIHF1ZSBzZSBlc2NyaWJlbiBpZ3VhbCBwZXJvIHRpZW5lbiBzaWduaWZpY2Fkb3MgZGlzdGludG9zIGN1YW5kbyBzb24gZXNjcml0YXMgY29uIG1hecO6c2N1bGFzLiAtLT4NCjwhLS0gKyAqKlNpbsOzbmltb3M6KiogU29uIGFxdWVsbGFzIHBhbGFicmFzIHF1ZSBzZSBlc2NyaWJlbiB5IHByb251bmNpYW4gZGlzdGludG8gcGVybyBzaWduaWZpY2FuIGxvIG1pc21vIGVuIGNhc2kgY3VhbHF1aWVyIGNvbnRleHRvLCB5IHB1ZWRlbiBzZXIgcmVlbXBsYXphZGFzIHVuYXMgcG9yIG90cmFzLiAtLT4NCjwhLS0gKyAqKkFudMOzbmltb3M6KiogU29uIHBhcmVzIGRlIHBhbGFicmFzIHF1ZSBkZWZpbmFuIHVuYSByZWxhY2nDs24gZGUgb3Bvc2ljacOzbiBiaW5hcmlhLiAtLT4NCjwhLS0gKyAqKkhpcGVybmltb3M6KiogU29uIHBhbGFicmFzIGRlIGxhcyBxdWUgc2UgZGVyaXZhbiBvdHJhcy4gKkZydXRhcyouIC0tPg0KPCEtLSArICoqSGlww7NuaW1vczoqKiBTb24gcGFsYWJyYXMgcXVlIHNlIGRlcml2YW4gZGUgb3RyYXMsIGN1eW8gc2lnbmlmaWNhZG8gZXMgbcOhcyBlc3BlY8OtZmljbyBhIHVuIGRldGVybWluYWRvIGNvbnRleHRvLiAqTWFuZ28qLiAtLT4NCg0KIyAqKjIuIE1vcmZvbG9nw61hLCBtb3Jmb3NpbnRheGlzLCBzaW50YXhpcyB5IHNlbcOhbnRpY2EqKg0KDQojIyAqKjIuMS4gTW9yZm9sb2fDrWEqKg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iOTUlIiBzcmM9ImZpZ3MvMDFfTW9yZm9sb2dpYS5wbmciPjwvYT48L2NlbnRlcj4NCjxicj48L2JyPg0KDQoqKipFbiBsYSBsaW5nw7zDrXN0aWNhKioqDQoNCisgTGEgKiptb3Jmb2xvZ8OtYSoqIGVzIGxhIHBhcnRlIGRlIGxhIGdyYW3DoXRpY2EgcXVlIGVzdHVkaWEgbGEgZXN0cnVjdHVyYSBkZSBsYXMgcGFsYWJyYXMgeSBzdXMgZWxlbWVudG9zIGNvbnN0aXR1dGl2b3MuDQoNCioqKkVuIGVsIHByb2Nlc2FtaWVudG8gZGVsIGxlbmd1YWplIG5hdHVyYWwqKioNCg0KKyBMYSAqKm1vcmZvbG9nw61hIGNvbXB1dGFjaW9uYWwqKiB0cmF0YSBkZSByZWNvbm9jZXIgZGUgZm9ybWEgYXV0b23DoXRpY2EgbG9zIG1vcmZlbWFzIHF1ZSBjb250aWVuZSB1bmEgcGFsYWJyYS4gRXN0YSBlcyBpbXBvcnRhbnRlIHBhcmEgcmVjb25vY2VyIHBhbGFicmFzIGNvbW8g4oCYcGVuc2Fy4oCZIHkg4oCYcGnDqW5zYWxv4oCZIGNvbW8gdW5hIHNvbGEsIGFkZW3DoXMgZGUgcmVjb25vY2VyIGVsIGfDqW5lcm8geSBuw7ptZXJvIGRlIHVuIG5vbWJyZSBwYXJhIGVuY2FqYXJsbyBjb24gdW4gYWRqZXRpdm8gcG9yIGVqZW1wbG8uDQorIEVuIGVsICoqYW7DoWxpc2lzIG1vcmZvbMOzZ2ljbyoqIGF1dG9tw6F0aWNvIHNlIG9idGllbmUgY29tbyBzYWxpZGEgbGEgcmHDrXogZGUgbGFzIHBhbGFicmFzIChsZW1hKSB5IGxhIGluZm9ybWFjacOzbiBncmFtYXRpY2FsIHF1ZSBhcG9ydGFuIGxvcyBkaWZlcmVudGVzIG1vcmZlbWFzLCBhIGxvIHF1ZSBzZSBsbGFtYSBjYXJhY3RlcsOtc3RpY2FzIG1vcmZvbMOzZ2ljYXMuDQogICsgKipFamVtcGxvOioqICdDYW50w6FiYW1vcycgdGllbmUgMyBtb3JmZW1hczog4oCYY2FudOKAmSAoY2FudGFyKSwg4oCYLWFiYeKAmSAocGFzYWRvKSB5IOKAmC1tb3PigJkgKHBsdXJhbCkuDQorIExhIGRpZmljdWx0YWQgZGVsIGFuw6FsaXNpcyBtb3Jmb2zDs2dpY28gdmFyw61hIHNlZ8O6biBlbCBpZGlvbWEuIEVuIGluZ2zDqXMgcG9yIGVqZW1wbG8gZXN0ZSBlcyBtw6FzIHNlbmNpbGxvIHF1ZSBlbiBlc3Bhw7FvbCwgcGVybyBlbiBjaGlubyBlcyBtw6FzIGNvbXBsaWNhZG8gcXVlIGVuIGxvcyBvdHJvcyBkb3MgaWRpb21hcy4NCisgUGFyYSBjb25zdHJ1aXIgdW4gc2lzdGVtYSBjYXBheiBkZSByZWFsaXphciBhbsOhbGlzaXMgbW9yZm9sw7NnaWNvIHNlIG5lY2VzaXRhOg0KICArIFVuICoqbGV4aWPDs24qKiwgZWwgY3VhbCBlcyB1biBjYXTDoWxvZ28gZGUgbGFzIHBhbGFicmFzIGRlIHVuYSBsZW5ndWEuIEVzdG8gZXMgaW52aWFibGUgeSBsbyBxdWUgc2Ugc3VlbGUgaGFjZXIgZXMgY3JlYXIgdW5hIGJhc2UgZGUgZGF0b3MgY29uIGluZm9ybWFjacOzbiBiw6FzaWNhIGRlIGxvcyBtb3JmZW1hczsgZXMgZGVjaXIsIHVuYSBsaXN0YSBkZSBtb3JmZW1hcyB5IGxhIGluZm9ybWFjacOzbiBiw6FzaWNhIHNvYnJlIGVsbG9zLCBjb24gdW4gY29uanVudG8gZGUgaGVjaG9zIG1vcmZvc2ludMOhY3RpY29zIHF1ZSBleHBsaXF1ZW4gY8OzbW8gc2UgcHVlZGVuIGNvbmNhdGVuYXIgbG9zIG1vcmZlbWFzIHBhcmEgZm9ybWFyIHBhbGFicmFzLg0KICArIFVuIGNvbmp1bnRvIGRlICoqaGVjaG9zIG1vcmZvdMOhY3RpY29zKiosIGxvcyBjdWFsZXMgaGFjZW4gcmVmZXJlbmNpYSBhbCBtb2RlbG8gcXVlIGRlc2NyaWJlIGVsIG9yZGVuIGRlIGxvcyBtb3JmZW1hcyB5IGRlbCBjdWFsIGVzIHBvc2libGUgZ2VuZXJhciB0b2RhcyBsYXMgcGFsYWJyYXMgZGUgdW4gbMOpeGljby4gRXN0b3MgZGVzY3JpYmVuIGVsIG9yZGVuIGRlIGxvcyBtb3JmZW1hcywgZXMgZGVjaXIsIHBvciBxdcOpIHVuYXMgY2xhc2VzIGRlIG1vcmZlbWFzIHNpZ3VlbiBhIG90cmFzIGRlbnRybyBkZSBsYXMgcGFsYWJyYXMuDQogICsgVW4gY29uanVudG8gZGUgKipyZWdsYXMgb3J0b2dyw6FmaWNhcyoqLCBsYXMgY3VhbGVzIHNlIHVzYW4gcGFyYSBtb2RlbGFyIGxvcyBjYW1iaW9zIGRlIG9ydG9ncmFmw61hIHF1ZSBvY3VycmVuIGVuIHVuYSBwYWxhYnJhIGN1YW5kbyBzZSBjb25jYXRlbmFuIGRvcyBtb3JmZW1hcy4NCisgTG9zICoqdHJhc2R1Y3RvcmVzIGRlIGF1dG9tw6F0YXMgZmluaXRvcyoqIHN1ZWxlbiBzZXIgbGEgZm9ybWEgbcOhcyBoYWJpdHVhbCBkZSByZWFsaXphciBlbCBhbsOhbGlzaXMgbW9yZm9sw7NnaWNvLiBVbiB0cmFuc2R1Y3RvciBkZSBhdXTDs21hdGFzIGZpbml0b3MgZXMgdW4gbW9kZWxvIGNvbXB1dGFjaW9uYWwgcXVlIHBlcm1pdGUgcHJvZHVjaXIgZGUgZm9ybWEgYXV0b23DoXRpY2EgdW5hIHNhbGlkYSBhIHBhcnRpciBkZSB1bmEgZW50cmFkYSBjb24gYmFzZSBlbiB1bmEgc2VyaWUgZGUgdHJhbnNpY2lvbmVzIGVudHJlIGVzdGFkb3MuIFBvciBlamVtcGxvLCBzZSB0cmFkdWNlIGxhIGVudHJhZGEgJ3Zpbm8nIGNvbW8gbGEgc2FsaWRhICd2aW5vICsgTiArIE1hc2MgKyBQbCcuDQoNCiMjICoqMi4yLiBNb3Jmb3NpbnRheGlzKioNCg0KPGJyPjwvYnI+DQo8Y2VudGVyPjxhPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX01vcmZvc2ludGF4aXMucG5nIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KKioqRW4gbGEgbGluZ8O8w61zdGljYSoqKg0KDQorIExhICoqbW9yZm9zaW50YXhpcyoqIHNlIGRlZmluZSBjb21vIGxhIHBhcnRlIGRlIGxhICoqZ3JhbcOhdGljYSoqIHF1ZSBpbnRlZ3JhIGxhICoqbW9yZm9sb2fDrWEqKiB5IGxhICoqc2ludGF4aXMqKiBwYXJhIGRldGVybWluYXIgbGFzIGRpZmVyZW50ZXMgcGFydGVzIGRlIGxhIG9yYWNpw7NuLCBsbGFtYWRhcyAqKnBhcnQtb2Ytc3BlZWNoIChQT1MpKiouDQorIExhcyAqKmNhdGVnb3LDrWFzIG1vcmZvc2ludMOhY3RpY2FzKiogZGVsIGxlbmd1YWplLCB0YW1iacOpbiBsbGFtYWRhcyBlbiBlc3Bhw7FvbCBjb21vIGNhdGVnb3LDrWFzIGdyYW1hdGljYWxlcyBwcm9wb3JjaW9uYW4gY2xhc2lmaWNhY2nDs24gZGUgbGFzIGRpZmVyZW50ZXMgcGFydGVzIGRlIGxhIG9yYWNpw7NuIHNlZ8O6biBzdSB0aXBvIGRlIHBhbGFicmEuDQorIEVsIGNvbm9jZXIgbGFzIGRpc3RpbnRhcyBwYXJ0ZXMgZGUgbGEgb3JhY2nDs24gZXMgw7p0aWwgZGViaWRvIGEgbGEgZ3JhbiBjYW50aWRhZCBkZSBpbmZvcm1hY2nDs24gcXVlIGJyaW5kYW4gc29icmUgdW5hIHBhbGFicmEgeSBzdXMgdmVjaW5vcywgYWRlbcOhcyBkZSBsb3MgZGV0YWxsZXMgcXVlIHByZXNlbnRhbiBzb2JyZSBsYSBlc3RydWN0dXJhIHNpbnTDoWN0aWNhIGRlIGxhIG9yYWNpw7NuLiANCiAgKyAqKkVqZW1wbG8gKHZlY2lub3MpOioqIExvcyBzdXN0YW50aXZvcyBzdWVsZW4gaXIgcHJlY2VkaWRvcyBkZSBkZXRlcm1pbmFudGVzIG8gc2VndWlkb3MgZGUgYWRqZXRpdm9zLg0KICArICoqRWplbXBsbyAoZXN0cnVjdHVyYSBzaW50w6FjdGljYSk6KiogTG9zIHN1c3RhbnRpdm9zIGZvcm1hbiBwYXJ0ZSBkZWwgc2ludGFnbWEgbm9taW5hbC4NCisgTGFzIGNhdGVnb3LDrWFzIG1vcmZvc2ludMOhY3RpY2FzIG8gZ3JhbWF0aWNhbGVzIGV4aXN0ZW50ZXMgc29uOg0KICArICoqU3VzdGFudGl2byAvIG5vbWJyZToqKiBzb24gcGFsYWJyYXMgY3V5b3MgZWxlbWVudG9zIHRpZW5lbiBnw6luZXJvIHkgbsO6bWVybyB5IGZvcm1hbiBzaW50YWdtYXMgbm9taW5hbGVzLCBkZW5vbWluYW5kbyBlbnRpZGFkZXMgZGUgZGlzdGludGEgbmF0dXJhbGV6YS4NCiAgKyAqKkRldGVybWluYW50ZToqKiBzb24gcGFsYWJyYXMgY3V5b3MgZWxlbWVudG9zIGRldGVybWluYW4gYWwgc3VzdGFudGl2byBvIGFsIGdydXBvIG5vbWluYWwsIHViaWPDoW5kb3NlIGdlbmVyYWxtZW50ZSBlbiBwb3NpY2nDs24gcHJlbm9taW5hbC4NCiAgKyAqKkFkamV0aXZvOioqIHNvbiBwYWxhYnJhcyBxdWUgbW9kaWZpY2FuIGEgdW4gc3VzdGFudGl2byB5IGRlbm90YW4gY3VhbGlkYWRlcywgcHJvcGllZGFkZXMgeSByZWxhY2lvbmVzIGRlIGRpdmVyc2EgbmF0dXJhbGV6YS4NCiAgKyAqKlByb25vbWJyZToqKiBzb24gcGFsYWJyYXMgY3V5b3MgZWxlbWVudG9zIGhhY2VuIGxhcyB2ZWNlcyBkZWwgc3VzdGFudGl2byBvIGRlbCBzaW50YWdtYSBub21pbmFsLg0KICArICoqVmVyYm86Kiogc29uIHBhbGFicmFzIHF1ZSBkZW5vdGFuIHVuYSBhY2Npw7NuIHkgdGllbmVuIHZhcmlhY2nDs24gZGUgcGVyc29uYSwgbsO6bWVybywgdGllbXBvLCBtb2RvIHkgYXNwZWN0by4NCiAgKyAqKkFkdmVyYmlvOioqIHNvbiBwYWxhYnJhcyBjdXlvcyBlbGVtZW50b3Mgc29uIGludmFyaWFibGVzIHkgdMOzbmljb3MsIHkgcHVlZGVuIG1vZGlmaWNhciBlbCBzaWduaWZpY2FkbyBkZSB2YXJpYXMgY2F0ZWdvcsOtYXMuDQogICsgKipQcmVwb3NpY2nDs246Kiogc29uIHBhbGFicmFzIGludmFyaWFudGVzIGN1eW9zIGVsZW1lbnRvcyBzZSBjYXJhY3Rlcml6YW4gcG9yIGludHJvZHVjaXIgdW4gdMOpcm1pbm8uDQogICsgKipDb25qdW5jacOzbjoqKiBzb24gcGFsYWJyYXMgaW52YXJpYWJsZXMgw6F0b25hcyBjdXlvcyBlbGVtZW50b3MgbWFuaWZpZXN0YW4gcmVsYWNpb25lcyBkZSBjb29yZGluYWNpw7NuIG8gc3Vib3JkaW5hY2nDs24gZW50cmUgcGFsYWJyYXMuDQogICsgKipJbnRlcmplY2Npw7NuOioqIHNvbiBwYWxhYnJhcyBpbnZhcmlhYmxlcyBjb24gY3V5b3MgZWxlbWVudG9zIGZvcm1hbiBlbnVuY2lhZG9zIGV4Y2xhbWF0aXZvcywgdmVyYmFsaXphbiBzZW50aW1pZW50b3MgbyByZWFsaXphbiBhY3RvcyBkZSBoYWJsYSBhcGVsYXRpdm9zLg0KDQoqKipFbiBlbCBwcm9jZXNhbWllbnRvIGRlbCBsZW5ndWFqZSBuYXR1cmFsKioqDQoNCisgRWwgKipldGlxdWV0YWRvIG1vcmZvc2ludMOhY3RpY28qKiBlcyBlbCBwcm9jZXNvIGRlIGlkZW50aWZpY2FyIGxhcyBkaXN0aW50YXMgcGFydGVzIGRlIGxhIG9yYWNpw7NuIHkgY29uc2lzdGUgZW4gYXNpZ25hciB1bmEgZXRpcXVldGEgKHRhZykgc29icmUgbGEgY2F0ZWdvcsOtYSBncmFtYXRpY2FsIGEgY2FkYSB1bmEgZGUgbGFzIHBhbGFicmFzIGRlIHVuIHRleHRvIGRlIGVudHJhZGEuDQorIExhICoqZW50cmFkYSBkZWwgYWxnb3JpdG1vKiogZXMgdW5hIHNlY3VlbmNpYSBkZSBwYWxhYnJhcyB5IGxhIHNhbGlkYSBlcyB1bmEgc2VjdWVuY2lhIGRlIHBhcmVzIGZvcm1hZG9zIHBvciBsYSBwYWxhYnJhIHkgbGEgY29ycmVzcG9uZGllbnRlIGV0aXF1ZXRhIGluZGljYW5kbyBzdSBjYXRlZ29yw61hIGdyYW1hdGljYWwuDQorIEVsIGV0aXF1ZXRhZG8gbW9yZm9zaW50w6FjdGljbyByZWFsaXphIGR1cmFudGUgc3UgZnVuY2lvbmFtaWVudG8gdW4gcHJvY2VzbyBkZSAqKmRlc2FtYmlndWFjacOzbioqIGRvbmRlIHJlY29ub2NlIGNvcnJlY3RhbWVudGUgbGEgZXRpcXVldGEgZGUgdW5hIHBhbGFicmEgcXVlIHB1ZWRlIHBlcnRlbmVjZXIgYSBtw6FzIGRlIHVuYSBjYXRlZ29yw61hIGdyYW1hdGljYWwuDQorIEFzw60gdGFtYmnDqW4sIHVuYSBwYXJ0ZSBkZWwgYWxnb3JpdG1vIGRlIGV0aXF1ZXRhZG8gZXMgZWwgKipwcmVwcm9jZXNhbWllbnRvKiogZGUgbGEgb3JhY2nDs24uIEVzdG8gc2UgcmVhbGl6YSB1bmEgdmV6IHF1ZSBxdWUgbGEgb3JhY2nDs24gaGF5YSBzaWRvICoqdG9rZW5pemFkYSoqLg0KKyBVbmEgZGUgbGFzIHTDqWNuaWNhcyBtw6FzIHVzdWFsZXMgZGUgZXRpcXVldGFkbyBtb3Jmb3NpbnTDoWN0aWNvcyBzb24gbG9zICoqbW9kZWxvcyBvY3VsdG9zIGRlIE1hcmtvdiAoSE1NKSoqLiANCisgVW4gbW9kZWxvIG9jdWx0byBkZSBNYXJrb3YgZXMgdW4gbW9kZWxvIGVzdGFkw61zdGljbyBxdWUgc2UgcHVlZGUgcmVwcmVzZW50YXIgY29tbyB1bmEgbcOhcXVpbmEgZGUgZXN0YWRvcyBmaW5pdG9zLCBwZXJvIGRvbmRlIGxhcyAqKnRyYW5zaWNpb25lcyoqIGVudHJlIGVzdGFkb3Mgc29uICoqcHJvYmFiaWzDrXN0aWNhcyoqIHkgbm8gZGV0ZXJtaW7DrXN0aWNhcy4gRWwgb2JqZXRpdm8gZXMgZGV0ZXJtaW5hciBsb3MgcGFyw6FtZXRyb3MgZGVzY29ub2NpZG9zIChvY3VsdG9zKSBhIHBhcnRpciBkZSBsb3MgcGFyw6FtZXRyb3Mgb2JzZXJ2YWJsZXMuDQogICsgKipFamVtcGxvOioqIFNpIHVuYSBwYWxhYnJhIGVzIGV0aXF1ZXRhZGEgY29tbyBkZXRlcm1pbmFudGUsIGxhIHByw7N4aW1hIHNlcsOhIHVuIG5vbWJyZSBjb24gNDAlIGRlIHByb2JhYmlsaWRhZCwgdW4gYWRqZXRpdm8gY29uIDQwJSB5IHVuIG7Dum1lcm8gY29uIDIwJS4NCisgUGFyYSBlbCBldGlxdWV0YWRvIG1vcmZvc2ludMOhY3RpY28gbG9zIEhNTSBzb24gZW50cmVuYWRvcyBlbiB1biAqKmNvbmp1bnRvIGRlIGRhdG9zIHRvdGFsbWVudGUgZXRpcXVldGFkb3MqKi4NCisgVmVhbW9zIHVuIHJlY3Vyc28gb25saW5lIHBhcmEgYWZpYW56YXIgbnVlc3RyYXMgaWRlYXM6IFtBbmFsaXphZG9yIG1vcmZvc2ludMOhY3RpY28gTGluZ3Vha2l0XShodHRwczovL2xpbmd1YWtpdC5jb20vZXMvZXRpcXVldGFkb3ItbW9yZm9zaW50YWN0aWNvKS4NCiAgDQojIyAqKjIuMy4gU2ludGF4aXMqKg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDFfU2ludGF4aXMuanBnIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KKioqRW4gbGEgbGluZ8O8w61zdGljYSoqKg0KDQorIExhICoqc2ludGF4aXMqKiBlcyBsYSBwYXJ0ZSBkZSBsYSBncmFtw6F0aWNhIHF1ZSBlc3R1ZGlhIGVsIG1vZG8gZW4gcXVlIHNlIGNvbWJpbmFuIGxhcyBwYWxhYnJhcyB5IGxvcyBncnVwb3MgcXVlIGVzdGFzIGZvcm1hbiBwYXJhIGV4cHJlc2FyIHNpZ25pZmljYWRvcywgYXPDrSBjb21vIGxhcyByZWxhY2lvbmVzIHF1ZSBzZSBlc3RhYmxlY2VuIGVudHJlIHRvZGFzIGVzYXMgdW5pZGFkZXMuDQorIEVsICoqYW7DoWxpc2lzIHNpbnTDoWN0aWNvKiogZGV0ZXJtaW5hIGxhcyByZWxhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMgZW50cmUgcGFsYWJyYXMuDQorIEVzdGUgZXMgdW4gKipwYXNvIGVzZW5jaWFsKiogcGFyYSBsYSBwb3N0ZXJpb3IgaWRlbnRpZmljYWNpw7NuIGRlIGxhcyAqKnJlbGFjaW9uZXMgc2Vtw6FudGljYXMqKiBkZSBsYXMgb3JhY2lvbmVzLg0KKyBTdSByZXN1bHRhZG8gZXMgdW4gKirDoXJib2wgc2ludMOhY3RpY28qKiBkb25kZSBsb3MgKipub2RvcyoqIHNvbiBsb3MgKipjb25zdGl0dXllbnRlcyBzaW50w6FjdGljb3MqKiB5IGxhcyAqKmhvamFzKiogc29uIGxhcyAqKnBhbGFicmFzKiogcXVlIGNvbXBvbmVuIGxhIG9yYWNpw7NuLg0KKyBVbiAqKmNvbnN0aXR1eWVudGUgc2ludMOhY3RpY28qKiBlcyB1bmEgcGFsYWJyYSwgbyB1bmEgc2VjdWVuY2lhIGRlIHBhbGFicmFzIHF1ZSByZWFsaXphbiB1bmEgZnVuY2nDs24gY29uanVudGEgZGVudHJvIGRlIGxhICoqZXN0cnVjdHVyYSBqZXLDoXJxdWljYSoqIGRlIGxhIG9yYWNpw7NuLiBBbCBjb25zdGl0dXllbnRlIGNvbXB1ZXN0byBkZSBkb3MgbyBtw6FzIGVsZW1lbnRvcyBzZSBsbyBsbGFtYSBzaW50YWdtYSBvIGdydXBvIHNpbnTDoWN0aWNvLg0KKyBMb3MgcHJpbmNpcGFsZXMgdGlwb3MgZGUgc2ludGFnbWEgZGVsIGVzcGHDsW9sIHNvbjoNCiAgKyBTaW50YWdtYSAqKm5vbWluYWwqKiAoU04pLCBjdXlvIG7DumNsZW8gZXMgdW4gc3VzdGFudGl2byBvIHByb25vbWJyZS4NCiAgKyBTaW50YWdtYSAqKnZlcmJhbCoqIChTViksIGN1eW8gbsO6Y2xlbyBlcyB1biB2ZXJiby4NCiAgKyBTaW50YWdtYSAqKnByZXBvc2ljaW9uYWwqKiAoU1AgbyBTUHJlcCksIGN1eW8gbsO6Y2xlbyBlcyB1bmEgcHJlcG9zaWNpw7NuLg0KICArIFNpbnRhZ21hICoqYWRqZXRpdmFsKiogKFNBZGopLCBjdXlvIG7DumNsZW8gZXMgdW4gYWRqZXRpdm8uDQogICsgU2ludGFnbWEgKiphZHZlcmJpYWwqKiAoU0FkdiksIGN1eW8gbsO6Y2xlbyBlcyB1biBhZHZlcmJpby4NCg0KKioqRW4gZWwgcHJvY2VzYW1pZW50byBkZWwgbGVuZ3VhamUgbmF0dXJhbCoqKg0KDQorIExvcyAqKmFuYWxpemFkb3JlcyBzaW50w6FjdGljb3MqKiBzdWVsZW4gYmFzYXJzZSBlbiAqKnByb2dyYW1hY2nDs24gZGluw6FtaWNhKiogeSAqKm3DqXRvZG9zIHByb2JhYmlsaXN0YXMqKi4gVW5vIGRlIGxvcyBhbGdvcml0bW9zIG3DoXMgY29tdW5lcyBlcyBlbCAqKmFsZ29yaXRtbyBDS1kgcHJvYmFiaWzDrXN0aWNvKiouDQorIEVzdG9zIHN1ZWxlbiBlbmZyZW50YXIgZWwgcHJvYmxlbWEgZGUgbGEgKiphbWJpZ8O8ZWRhZCBlc3RydWN0dXJhbCoqLiBFc3RhIHNlIGRlYmUgYSBsYXMgbcO6bHRpcGxlcyByZWdsYXMgcmVwcmVzZW50YWRhcyBlbiB1bmEgZ3JhbcOhdGljYSBxdWUgcHJvdmllbmVuIGRlbCB1c28gY29tw7puIGRlIHVuYSBsZW5ndWEgeSBxdWUgcGVybWl0ZW4gcXVlIHNlIHB1ZWRhIGVuY29udHJhciAqKnZhcmlvcyByZXN1bHRhZG9zIGRlbCBhbsOhbGlzaXMgc2ludMOhY3RpY28qKiBxdWUgc2UgYWp1c3RlIGNvcnJlY3RhbWVudGUgYSB1bmEgZnJhc2UgYW5hbGl6YWRhLiANCisgQWwgZmluYWwgbGEgKipzZWxlY2Npw7NuIGRlbCByZXN1bHRhZG8gZmluYWwqKiBzZSByZWFsaXphIG5vcm1hbG1lbnRlIGEgdHJhdsOpcyBkZSBwcm9jZXNvcyBkZSAqKmRlc2FtYmlndWFjacOzbiBzaW50w6FjdGljYSoqIHF1ZSByZXF1aWVyZW4gZnVlbnRlcyBkZSBjb25vY2ltaWVudG8gKiplc3RhZMOtc3RpY28qKiwgKipzZW3DoW50aWNvKiogeSAqKmNvbnRleHR1YWwqKi4gDQorIEFmaWFuY2Vtb3MgbnVlc3RyYXMgaWRlYXMgY29uIHVuIHJlY3Vyc28gb25saW5lOiBbQW5hbGl6YWRvciBzaW50w6FjdGljbyBMaW5ndWFraXRdKGh0dHBzOi8vbGluZ3Vha2l0LmNvbS9lcy9hbmFsaXphZG9yLXNpbnRhY3RpY28pLg0KDQojIyAqKjIuNC4gU2Vtw6FudGljYSoqDQoNCjxicj48L2JyPg0KPGNlbnRlcj48YT48aW1nIHdpZHRoPSI4MCUiIHNyYz0iZmlncy8wMV9TZW1hbnRpY0FuYWxpc2lzLmdpZiI+PC9hPjwvY2VudGVyPg0KPGJyPjwvYnI+DQoNCioqKkVuIGxhIGxpbmfDvMOtc3RpY2EqKioNCg0KKyBMYSAqKnNlbcOhbnRpY2EqKiBzZSBkZWZpbmUgY29tbyBsYSBkaXNjaXBsaW5hIHF1ZSBlc3R1ZGlhIGVsIHNpZ25pZmljYWRvIGRlIGxhcyB1bmlkYWRlcyBsaW5nw7zDrXN0aWNhcyB5IGRlIHN1cyBjb21iaW5hY2lvbmVzLg0KKyBFc3RvIGVzIG5lY2VzYXJpbyBlbiBhbGd1bmFzIHRhcmVhcyBkZWwgcHJvY2VzYW1pZW50byBkZWwgbGVuZ3VhamUgbmF0dXJhbC4gRXMgZGVjaXIsIG5lY2VzaXRhbW9zIG5vIHNvbG8gZWwgKipjb25vY2ltaWVudG8gbGluZ8O8w61zdGljbyoqIChtb3Jmb2xvZ8OtYSB5IHNpbnRheGlzKSBzaW5vIHRhbWJpw6luICoqaW5mb3JtYWNpw7NuIG5vIGxpbmfDvMOtc3RpY2EqKiAoc2Vtw6FudGljYSkuDQorIExhICoqc2Vtw6FudGljYSBsw6l4aWNhKiogZXN0dWRpYSBlbCBzaWduaWZpY2FkbyBkZSBsYXMgcGFsYWJyYXMsIGFzw60gY29tbyBsYXMgZGl2ZXJzYXMgcmVsYWNpb25lcyBkZSBzZW50aWRvIHF1ZSBzZSBlc3RhYmxlY2VuIGVudHJlIGVsbGFzLg0KKyBDb25vY2VyIGFkZW3DoXMgZWwgc2lnbmlmaWNhZG8gZGUgdW5hICoqb3JhY2nDs24qKiwgeSAqKm5vIHNvbG8gZGUgdW5hIHBhbGFicmEqKiBlcyB0YW1iacOpbiBpbXByZXNjaW5kaWJsZSBwYXJhIHJlYWxpemFyIGVmaWNpZW50ZW1lbnRlIGRpdmVyc2FzIHRhcmVhcyBkZSBwcm9jZXNhbWllbnRvIGRlbCBsZW5ndWFqZSBuYXR1cmFsLg0KKyBMYSAqKnNlbcOhbnRpY2EgY29tcG9zaWNpb25hbCoqIGVzdHVkaWEgZWwgc2lnbmlmaWNhZG8gZGUgbG9zIHNpbnRhZ21hcyB5IGxhcyBvcmFjaW9uZXMuIA0KKyBFbCAqKmFuw6FsaXNpcyBzZW3DoW50aWNvKiogdGllbmUgY29tbyBvYmpldGl2byBwcm9kdWNpciB1bmEgcmVwcmVzZW50YWNpw7NuIGRlbCBzaWduaWZpY2FkbyBlbiB1bmEgb3JhY2nDs24uDQoNCioqKkVuIGVsIHByb2Nlc2FtaWVudG8gZGVsIGxlbmd1YWplIG5hdHVyYWwqKioNCg0KKyBMYSAqKmNyZWFjacOzbiBhdXRvbcOhdGljYSoqIGRlIHVuYSByZXByZXNlbnRhY2nDs24gcmlndXJvc2EgZGVsIHNpZ25pZmljYWRvIGRlIGxhIG9yYWNpw7NuIHJlcXVpZXJlIGRlICoqbcO6bHRpcGxlcyBmdWVudGVzIGRlIGNvbm9jaW1pZW50byB5IHTDqWNuaWNhcyBkZSBpbmZlcmVuY2lhKiouIEFsZ3Vub3MgZGUgbG9zIGNvbm9jaW1pZW50b3MgbmVjZXNhcmlvcyBzb246DQogICsgTG9zIHNpZ25pZmljYWRvcyBkZSBsYXMgcGFsYWJyYXMNCiAgKyBMb3Mgc2lnbmlmaWNhZG9zIGFzb2NpYWRvcyBhIGxhcyBjb25zdHJ1Y2Npb25lcyBncmFtYXRpY2FsZXMNCiAgKyBMYSBlc3RydWN0dXJhIGRlbCBkaXNjdXJzbw0KICArIEVsIHRlbWEgZW4gY3Vlc3Rpw7NuDQogICsgRWwgZXN0YWRvIGRlIGxhcyBjb3NhcyBlbiBlbCBtb21lbnRvIGVuIGVsIHF1ZSB0aWVuZSBsdWdhciBlbCBkaXNjdXJzbw0KKyBMYSAqKnJlcHJlc2VudGFjacOzbiBmb3JtYWwqKiBkZWwgc2lnbmlmaWNhZG8gZGViZSBzZXIgdmVyaWZpY2FibGUsIGluZXF1w612b2NhLCBleHByZXNpdmEgeSBwZXJtaXRpciBsYSBpbmZlcmVuY2lhIGRlIG51ZXZvIGNvbm9jaW1pZW50by4NCisgTGEgbWF5b3LDrWEgZGUgbG9zIG1vZGVsb3MgcXVlIHNlIHV0aWxpemFuIHBhcmEgcmVwcmVzZW50YXIgZWwgc2lnbmlmaWNhZG8gdGllbmVuIGVuIGNvbcO6biBsYSBjYXBhY2lkYWQgcGFyYSByZXByZXNlbnRhciBvYmpldG9zLCBzdXMgcHJvcGllZGFkZXMgeSBsYXMgcmVsYWNpb25lcyBlbnRyZSBlc3Rvcy4NCisgRW50cmUgbGFzICoqZXN0cmF0ZWdpYXMqKiBxdWUgc2lydmVuIHBhcmEgcmVwcmVzZW50YXIgZWwgbGVuZ3VhamUgdGVuZW1vczoNCiAgKyBMw7NnaWNhIGRlIHByaW1lciBvcmRlbg0KICArIFJlZGVzIHNlbcOhbnRpY2FzDQogICsgRGlhZ3JhbWFzIGRlIGRlcGVuZGVuY2lhcyBjb25jZXB0dWFsZXMNCiAgKyBTaXN0ZW1hcyBiYXNhZG9zIGVuIHBsYW50aWxsYXMNCisgRW4gbGEgcmVhbGlkYWQgbm8gZXMgbXV5IGNvbcO6biB1c2FyIGVsIGFuw6FsaXNpcyBzaW50w6FjdGljbyBjb21vIGlucHV0IGVuIGVsIGFuw6FsaXNpcyBzZW3DoW50aWNvIChkZWJpZG8gYSBxdWUgc2UgbmVjZXNpdGEgY29ub2NpbWllbnRvIGVzcGVjw61maWNvIHNvYnJlIGVsIGVqZW1wbG8pIHkgcG9yIGVsbG8gbG8gcXVlIHNlIGhhY2UgZXMgaW50ZWdyYXIgZWwgY29ub2NpbWllbnRvIGVuIGVsIGFuw6FsaXNpcyBzaW50w6FjdGljby4rDQorIEFsIGHDsWFkaXIgZWwgY29ub2NpbWllbnRvIHNlbcOhbnRpY28gYSBsYXMgcmVnbGFzIGdyYW1hdGljYWxlcyB5IGEgbGFzIGVudHJhZGFzIGzDqXhpY2FzIHF1ZSBjb25mb3JtYW4gbGEgZ3JhbcOhdGljYSBzZSBsbyBjb25vY2UgY29tbyAqKnJ1bGUtdG8tcnVsZSBoeXBvdGhlc2lzKiouDQoNCjwhLS0gIyAqKjIuIEVqZXJjaWNpbyBwcsOhY3RpY28qKiAgLS0+DQoNCjwhLS0gIyMgKirDgXJib2xlcyBzaW50w6FjdGljb3MqKiAtLT4NCg0KPCEtLSBFbGFib3JhIHVuYSBvcmFjacOzbiBlbiBpZGlvbWEgZXNwYcOxb2wsIHJlYWxpemEgZWwgYW7DoWxpc2lzIGRlIHN1IMOhcmJvbCBzaW50w6FjdGljbyBjb24gY3VhbHF1aWVyYSBkZSBsYXMgaGVycmFtaWVudGFzIGRpc3BvbmliaWxpemFkYXMgeSBlbnbDrWEgdW5hIGNhcHR1cmEgZGUgcGFudGFsbGEgZGUgdHUgZWplcmNpY2lvIGFsIGNvcnJlbyBkZSB0dSBpbnN0cnVjdG9yIChodWdvLXNYZUBob3RtYWlsLmNvbSkuIC0tPg0KDQojICoqMy4gRWplcmNpY2lvIHByw6FjdGljbyoqDQoNCkNvbW8gdW4gcHJpbWVyIGFjZXJjYW1pZW50byB1dGlsaXphcmVtb3MgdW5hIGRlIGxhcyBsaWJyZXLDrWFzIG3DoXMgY29tcGxldGFzIGRlIFBMTjogW1VEUGlwZSwgY3JlYWRhIHBvciBsYSBGYWN1bHRhZCBkZSBNYXRlbcOhdGljYXMgeSBGw61zaWNhIGRlIGxhIFVuaXZlcnNpZGFkIGRlIFJlcMO6YmxpY2EgQ2hlY2FdKGh0dHA6Ly91ZmFsLm1mZi5jdW5pLmN6L3VkcGlwZSkgeSBkZXNjYXJnYXJlbW9zIHVuIG1vZGVsbyBwcmUtZW50cmVuYWRvIGd1YXJkYWRvIGNvbW8gdW4gb2JqZXRvIGVuIFI6DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9Rn0NCiMgRGVzY2FyZ2EgZGUgbW9kZWxvIHByZWVudHJlbmFkbyB1ZHBpcGUNCmxpYnJhcnkodWRwaXBlKQ0KI3VkcGlwZTo6dWRwaXBlX2Rvd25sb2FkX21vZGVsKCdzcGFuaXNoJykgIyBEZXNjb21lbnRhciBhbCBlamVjdXRhciBwb3IgcHJpbWVyYSB2ZXoNCmBgYA0KDQpBaG9yYSBjYXJnYXJlbW9zIGVsIG1vZGVsbyBlbiBlc3Bhw7FvbCBkZXNjYXJnYWRvIHkgbG8gdXRpbGl6YXJlbW9zIHBhcmEgKiphbm90YXIqKiB1bmEgZnJhc2UgKGF5dWTDoW5kb25vcyBkZSBsYSBsaWJyZXLDrWEgKnN0cmluZ3IqIHBhcmEgZXZpdGFyIHByb2JsZW1hcyBjb24gbGEgY29kaWZpY2FjacOzbiwgeSBkZSBsYSBsaWJyZXLDrWEgKmRwbHlyKiBwYXJhIG1hbmlwdWxhciBsb3MgcmVzdWx0YWRvcyk6DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9Rn0NCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ2FyZ2EgZGUgbW9kZWxvIHByZS1lbnRyZW5hZG8NCm1vZGVsID0gdWRwaXBlX2xvYWRfbW9kZWwoZmlsZSA9ICJzcGFuaXNoLWdzZC11ZC0yLjQtMTkwNTMxLnVkcGlwZSIpDQoNCiMgQW5vdGFjacOzbg0KdGV4dCA9ICJFc3RhbW9zIG11eSBpbnRlcmVzYWRvcyBlbiBzYWJlciBjdcOhbCBzZXLDoSBlbCBwcm95ZWN0byBkZSBmaW4gZGUgY3Vyc28uIg0KdGV4dF9hbm5vdGF0ZWQgPSB1ZHBpcGVfYW5ub3RhdGUobW9kZWwsIHggPSBzdHJpX2VuY190b3V0ZjgodGV4dCkpDQp0ZXh0X2Fubm90YXRlZCA9IHRleHRfYW5ub3RhdGVkICU+JSBhc190aWJibGUoZW5jb2Rpbmc9ImxhdGluLTEiKQ0KYGBgDQoNCkZpbmFsbWVudGUgcHJlc2VudGFyZW1vcyBlbCByZXN1bHRhZG8gdGFidWxhciAoY29uIGxhIGxpYnJlcsOtYSAqa2FibGVFeHRyYSogcGFyYSBxdWUgbGEgdGFibGEgc2UgdmVhIGJpZW4pOg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZ9DQpsaWJyYXJ5KGthYmxlRXh0cmEpDQp0ZXh0X2Fubm90YXRlZCAlPiUgc2VsZWN0KHRva2VuLCBsZW1tYSwgdXBvcywgZmVhdHMsIGhlYWRfdG9rZW5faWQpICU+JSBrYWJsZSgpICU+JSBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDE0KQ0KYGBgDQoNClkgY29uIHVuIGdyw6FmaWNvIChiYXNhZG8gZW4gbGFzIGxpYnJlcsOtYXMgKmdncGxvdDIqLCAqaWdyYXBoKiB5ICpnZ3JhcGgqLCBhZGFwdGFkbyBkZSBsYSBlbnRyYWRhIFsnZGVwZW5kZW5jeSBwYXJzaW5nIHdpdGggdWRwaXBlJywgci1ibG9nZ2Vycy5jb21dKGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tLzIwMTkvMDcvZGVwZW5kZW5jeS1wYXJzaW5nLXdpdGgtdWRwaXBlLykpOg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZ9DQpsaWJyYXJ5KGlncmFwaCkNCmxpYnJhcnkoZ2dyYXBoKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIEZ1bmNpw7NuIHBhcmEgZ3JhZmljYXIgZGVwZW5kZW5jaWFzDQpwbG90X2Fubm90YXRpb24gPSBmdW5jdGlvbih4LCBzaXplID0gMyl7DQogIHN0b3BpZm5vdChpcy5kYXRhLmZyYW1lKHgpICYgYWxsKGMoInNlbnRlbmNlX2lkIiwgInRva2VuX2lkIiwgImhlYWRfdG9rZW5faWQiLCAiZGVwX3JlbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRva2VuX2lkIiwgInRva2VuIiwgImxlbW1hIiwgInVwb3MiLCAieHBvcyIsICJmZWF0cyIpICVpbiUgY29sbmFtZXMoeCkpKQ0KICB4ID0geFshaXMubmEoeCRoZWFkX3Rva2VuX2lkKSwgXQ0KICB4ID0geFt4JHNlbnRlbmNlX2lkICVpbiUgbWluKHgkc2VudGVuY2VfaWQpLCBdDQogIGVkZ2VzID0geFt4JGhlYWRfdG9rZW5faWQgIT0gMCwgYygidG9rZW5faWQiLCAiaGVhZF90b2tlbl9pZCIsICJkZXBfcmVsIildDQogIGVkZ2VzJGxhYmVsID0gZWRnZXMkZGVwX3JlbA0KICBnID0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGVkZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcyA9IHhbLCBjKCJ0b2tlbl9pZCIsICJ0b2tlbiIsICJsZW1tYSIsICJ1cG9zIiwgInhwb3MiLCAiZmVhdHMiKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGVkID0gVFJVRSkNCiAgZ2YgPSBnZ3JhcGgoZywgbGF5b3V0ID0gImxpbmVhciIpICsNCiAgICBnZW9tX2VkZ2VfYXJjKGFlcyhsYWJlbCA9IGRlcF9yZWwsIHZqdXN0ID0gLTAuMjApLA0KICAgICAgICAgICAgICAgICAgYXJyb3cgPSBncmlkOjphcnJvdyhsZW5ndGggPSB1bml0KDQsICdtbScpLCBlbmRzID0gImxhc3QiLCB0eXBlID0gImNsb3NlZCIpLA0KICAgICAgICAgICAgICAgICAgbGFiZWxfY29sb3VyID0gInJlZCIsIGNoZWNrX292ZXJsYXAgPSBUUlVFLCBsYWJlbF9zaXplID0gc2l6ZSkgKw0KICAgIGdlb21fbm9kZV9sYWJlbChhZXMobGFiZWwgPSB0b2tlbiksIGNvbCA9ICJkYXJrZ3JlZW4iLCBzaXplID0gc2l6ZSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSB1cG9zKSwgbnVkZ2VfeSA9IC0wLjM1LCBzaXplID0gc2l6ZSkgKw0KICAgIGxhYnModGl0bGUgPSAiUmVzdWx0YWRvIFVEcGlwZSIsIA0KICAgICAgICAgc3VidGl0bGUgPSAiVG9rZW5pemFjacOzbiwgZXRpcXVldGFkbyBQT1MgeSByZWxhY2lvbmVzIGRlIGRlcGVuZGVuY2lhIikNCiAgcmV0dXJuKGdmKQ0KfQ0KDQojIEdyw6FmaWNvDQpwbG90X2Fubm90YXRpb24odGV4dF9hbm5vdGF0ZWQpDQpgYGANCg0KUGFyYSBpbnRlcnByZXRhciBsb3MgcmVzdWx0YWRvcyBkZSBkZXBlbmRlbmNpYXMgZXMgbmVjZXNhcmlvIHJlZmVyaXJub3MgYSBbdW5pdmVyc2FsZGVwZW5kZW5jaWVzLm9yZ10oaHR0cHM6Ly91bml2ZXJzYWxkZXBlbmRlbmNpZXMub3JnL3UvZGVwLyksIGxhIGN1YWwgZXN0w6EgY29uc3RydWlkYSBzb2JyZSBsYSBpbnZlc3RpZ2FjacOzbiBkZSBARGVNYXJuZWZmZTIwMTQuDQoNCiMgKio0LiBUYXJlYTogQW7DoWxpc2lzIG1vcmZvbMOzZ2ljbyB5IG1vcmZvc2ludMOhY3RpY28qKg0KDQpFbCBzaWd1aWVudGUgZGViZXIgc2UgZW50cmVnYXLDoSBjb21vIHVuIHNjcmlwdCBlbiBSIGRlIHRhbCBtYW5lcmEgcXVlIGVsIGluc3RydWN0b3IgbG8gcHVlZGEgcmVwbGljYXIgZW4gc3UgbcOhcXVpbmEgc2luIGxhIG5lY2VzaWRhZCBkZSBjYXJnYXIgdW4gYXJjaGl2by4gQSBjb250aW51YWNpw7NuIGxhcyBpbnN0cnVjY2lvbmVzOg0KDQorIEVsYWJvcmEgdW5hIG9yYWNpw7NuIGVuIGlkaW9tYSBlc3Bhw7FvbC4NCisgUmVhbGl6YSBzdSBhbsOhbGlzaXMgc2ludMOhY3RpY28geSBtb3Jmb3NpbnTDoWN0aWNvIGEgdHJhdsOpcyBkZSBsYSBsaWJyZXLDrWEgVURwaXBlIChubyBlcyBuZWNlc2FyaW8gcXVlIHJlYWxpY2VzIGVsIGdyw6FmaWNvKS4NCisgQ29tZW50YSBsb3MgcmVzdWx0YWRvcy4NCg0KQWwgZmluYWwsIGVudsOtYSBlbCBlamVyY2ljaW8gYWwgY29ycmVvIGRlIHR1IGluc3RydWN0b3IgKGh1Z28tc1hlQGhvdG1haWwuY29tKS4gQXF1ZWxsb3MgdHJhYmFqb3Mgc2luIGNvbWVudGFyaW9zIHNvYnJlIGxvcyByZXN1bHRhZG9zIHNlcsOhbiBjYWxpZmljYWRvcyBjb24gdW5hIG5vdGEgZGUgY2VybyBwdW50b3Mgc29icmUgZGllei4NCg0KIyAqKjUuIEJpYmxpb2dyYWbDrWEqKg==