Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgX19fXyAgICAgICAgICAgICAgICAgICAgICAgIF8gICAgICBfCi8vICAgICAvIF9fX3xfX19fIF8gICBfIF9fX18gICBfX19ffCB8X18gIHwgfAovLyAgICB8IHwgICAvIF9fX3wgfCB8IHwgIF8gIFwvIF9fX3wgIF8gIFx8IHwKLy8gICAgfCB8X19ffCB8ICB8IHxffCB8IHwgfCB8IHxfX198IHwgfCB8fF98Ci8vICAgICBcX19fX3xffCAgXF9fX19ffF98IHxffFxfX19ffF98IHxffChfKSBNZWRpYSBiZW5jaG1hcmtzCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgCi8vCSCpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uLCBsaWNlbnNlZCB1bmRlciBBcGFjaGUgMi4wIAovLwovLyAgZmlsZSA6IEltYWdlTWVhc3VyZW1lbnRzLmgKLy8gIGF1dGhvciA6CVNjb3R0IEV0dGluZ2VyCS0gc2NvdHQubS5ldHRpbmdlckBpbnRlbC5jb20KLy8JCQkJSmVhbi1ZdmVzIEJvdWd1ZXQgLSBqZWFuLXl2ZXMuYm91Z3VldEBpbnRlbC5jb20KLy8gIGRlc2NyaXB0aW9uIDogSW1hZ2UgTWVhc3VyZW1lbnRzIChzaWxob3VldHRlIGFuZCBlZGdlcykKLy8gIG1vZGlmaWVkIDogCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgojaWZuZGVmIElNQUdFTUVBU1VSRU1FTlRTX0gKI2RlZmluZSBJTUFHRU1FQVNVUkVNRU5UU19ICgojaWYgZGVmaW5lZChIQVZFX0NPTkZJR19IKQojIGluY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlIDxGbGV4TGliLmg+CiNpbmNsdWRlICJCaW5hcnlJbWFnZS5oIgojaW5jbHVkZSAiSW1hZ2VQcm9qZWN0aW9uLmgiCgojZGVmaW5lIEZsZXhJbWFnZTh1IEZsZXhJbWFnZTxJbTh1LDE+CiNkZWZpbmUgRmxleEltYWdlMzJmIEZsZXhJbWFnZTxJbTMyZiwxPgoKI2luY2x1ZGUgPHZlY3Rvcj4KCi8vRGVmYXVsdCBncmFudWxhcml0eSBvZiBzYW1wbGluZyBvZiB0aGUgcHJvamVjdGVkIGN5bGluZGVyIGVkZ2VzOgojZGVmaW5lIFNURVBfREVGQVVMVCA1LjAwZgoKLy9EZWZhdWx0IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGdyYW51bGFyaXRpZXMgb2Ygc2FtcGxpbmcgb2YgdGhlIGluc2lkZSBvZiB0aGUgcHJvamVjdGVkIGN5bGluZGVyOgojZGVmaW5lIEhfU1RFUF9ERUZBVUxUIDEwLjAwZgojZGVmaW5lIFZfU1RFUF9ERUZBVUxUIDEwLjAwZgoKCmNsYXNzIEltYWdlTWVhc3VyZW1lbnRzCnsKcHJpdmF0ZToKCXN0ZDo6dmVjdG9yPFBvaW50PiBtU2FtcGxlczsJCQkJCQkJCQkJCS8vcGl4ZWwgc2FtcGxlcyAoZm9yIGVhY2ggYm9keSBwYXJ0LCBlZGdlIGFuZCBpbnNpZGUpCgoJZmxvYXQgbVN0ZXA7CQkJCQkJCQkJCQkJCQkJLy9TYW1wbGluZyByZXNvbHV0aW9uIG9mIHRoZSBlZGdlcyBpbiBwaXhlbHMgKGRlZmF1bHQ6IFNURVBfREVGQVVMVCkKCWZsb2F0IG1Ic3RlcCxtVnN0ZXA7CQkJCQkJCQkJCQkJCS8vSG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc2FtcGxpbmcgcmVzb2x1dGlvbnMgb2YgaW5zaWRlIHRoZSBsaW1icyAoZGVmYXVsdHM6IEhfU1RFUF9ERUZBVUxULFZfU1RFUF9ERUZBVUxUKQoJCgkvL2NvbXB1dGUgZXJyb3IgYXQgdGhlIGVkZ2VzIG9mIGEgcHJvamVjdGVkIGN5bGluZGVyIChib2R5IHBhcnQpCgl2b2lkIEVkZ2VFcnJvcihjb25zdCBQcm9qZWN0ZWRDeWxpbmRlciAmUHJvakN5bCwgY29uc3QgRmxleEltYWdlOHUgJkVkZ2VNYXAsIGZsb2F0ICZlcnJvciwgaW50ICZzYW1wbGVQb2ludHMpOwkKCgkvL2NvbXB1dGUgZXJyb3IgaW5zaWRlIG9mIGEgcHJvamVjdGVkIGN5bGluZGVyIChib2R5IHBhcnQpCgl2b2lkIEluc2lkZUVycm9yKGNvbnN0IFByb2plY3RlZEN5bGluZGVyICZQcm9qQ3lsLCBjb25zdCBCaW5hcnlJbWFnZSAmRkdtYXAsIGludCAmZXJyb3IsIGludCAmc2FtcGxlUG9pbnRzKTsKCnB1YmxpYzoKCUltYWdlTWVhc3VyZW1lbnRzKCl7U2V0U2FtcGxpbmdSZXNvbHV0aW9ucyhTVEVQX0RFRkFVTFQsIEhfU1RFUF9ERUZBVUxULCBWX1NURVBfREVGQVVMVCk7IH07Cgl+SW1hZ2VNZWFzdXJlbWVudHMoKXt9OwoKCS8vU2V0IHNhbXBsaW5nIGRlbnNpdGllcwoJdm9pZCBTZXRTYW1wbGluZ1Jlc29sdXRpb25zKGZsb2F0IGVkZ2UsIGZsb2F0IGluc2lkZV9oLCBmbG9hdCBpbnNpZGVfdil7bVN0ZXA9ZWRnZTsgbUhzdGVwPWluc2lkZV9oOyBtVnN0ZXA9aW5zaWRlX3Y7fTsKCQoJLy9FZGdlIGVycm9yIG9mIGEgY29tcGxldGUgYm9keSBvbiBhbGwgY2FtZXJhIGltYWdlcwoJZmxvYXQgSW1hZ2VFcnJvckVkZ2Uoc3RkOjp2ZWN0b3I8RmxleEltYWdlOHU+ICZJbWFnZU1hcHMsIE11bHRpQ2FtZXJhUHJvamVjdGVkQm9keSAmUHJvakJvZGllcyk7CgoJLy9TaWxob3VldHRlIGVycm9yIG9mIGEgY29tcGxldGUgYm9keSBvbiBhbGwgY2FtZXJhIGltYWdlcwoJZmxvYXQgSW1hZ2VFcnJvckluc2lkZShzdGQ6OnZlY3RvcjxCaW5hcnlJbWFnZT4gJkltYWdlTWFwcywgTXVsdGlDYW1lcmFQcm9qZWN0ZWRCb2R5ICZQcm9qQm9kaWVzKTsKfTsKCiNlbmRpZgo=