ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDkyN2Q5ZTMuLmNlMWE2MDMgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTEsOCArMTEsOCBAQAogCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgbWFpbi5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICBWb2x1bWVNYW5hZ2VyLmNwcCAgICAgICAgICAgICAgICAgICAgXAotCQkgIENvbW1hbmRMaXN0ZW5lci5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBWb2x1bWVNYW5hZ2VyLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgQ29tbWFuZExpc3RlbmVyLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgIFZvbGRDb21tYW5kLmNwcCAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICBOZXRsaW5rTWFuYWdlci5jcHAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgTmV0bGlua0hhbmRsZXIuY3BwICAgICAgICAgICAgICAgICAgIFwKQEAgLTI0LDIyICsyNCwyNyBAQAogICAgICAgICAgICAgICAgICAgTG9vcC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgIERldm1hcHBlci5jcHAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICBSZXNwb25zZUNvZGUuY3BwICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgWHdhcnAuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIG1kNS5jCisgICAgICAgICAgICAgICAgICBYd2FycC5jcHAKIAogTE9DQUxfTU9EVUxFOj0gdm9sZAogCi1MT0NBTF9DX0lOQ0xVREVTIDo9ICQoS0VSTkVMX0hFQURFUlMpIC1JLi4vLi4vZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvCitMT0NBTF9DX0lOQ0xVREVTIDo9ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICQoS0VSTkVMX0hFQURFUlMpICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQogCiBMT0NBTF9DRkxBR1MgOj0gCiAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlic3lzdXRpbHMgbGliY3V0aWxzIGxpYmRpc2tjb25maWcKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnN5c3V0aWxzICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJjdXRpbHMgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGliZGlza2NvbmZpZyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmNyeXB0bwogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICB2ZGMuYyBcCisKK0xPQ0FMX1NSQ19GSUxFUzo9IHZkYy5jCiAKIExPQ0FMX01PRFVMRTo9IHZkYwogCmRpZmYgLS1naXQgYS9Wb2x1bWVNYW5hZ2VyLmNwcCBiL1ZvbHVtZU1hbmFnZXIuY3BwCmluZGV4IGM4ZTQ0ODAuLmRkMjVkODYgMTAwNjQ0Ci0tLSBhL1ZvbHVtZU1hbmFnZXIuY3BwCisrKyBiL1ZvbHVtZU1hbmFnZXIuY3BwCkBAIC0yNyw2ICsyNyw4IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiVm9sZCIKIAorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisKICNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAKICNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rRXZlbnQuaD4KQEAgLTM5LDcgKzQxLDYgQEAKICNpbmNsdWRlICJEZXZtYXBwZXIuaCIKICNpbmNsdWRlICJQcm9jZXNzLmgiCiAjaW5jbHVkZSAiQXNlYy5oIgotI2luY2x1ZGUgIm1kNS5oIgogCiBWb2x1bWVNYW5hZ2VyICpWb2x1bWVNYW5hZ2VyOjpzSW5zdGFuY2UgPSBOVUxMOwogCkBAIC02MiwyMiArNjMsMjIgQEAKICAgICBkZWxldGUgbUFjdGl2ZUNvbnRhaW5lcnM7CiB9CiAKLWNoYXIgKlZvbHVtZU1hbmFnZXI6OmFzZWNIYXNoKGNvbnN0IGNoYXIgKmlkLCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW4pIHsKLSAgICBNRDVfQ1RYIGN0eDsKLSAgICB1bnNpZ25lZCBjaGFyIHNpZ1sxNl07CisjZGVmaW5lIE1ENV9BU0NJSV9MRU5HVEggKChNRDVfRElHRVNUX0xFTkdUSCoyKSsxKQogCi0gICAgaWYgKGxlbiA8IDMzKSB7Ci0gICAgICAgIExPR0UoIlRhcmdldCBoYXNoIGJ1ZmZlciBzaXplIDwgMzMgYnl0ZXMgKCVkKSIsIGxlbik7CitjaGFyICpWb2x1bWVNYW5hZ2VyOjphc2VjSGFzaChjb25zdCBjaGFyICppZCwgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuKSB7CisgICAgdW5zaWduZWQgY2hhciBzaWdbTUQ1X0RJR0VTVF9MRU5HVEhdOworCisgICAgaWYgKGxlbiA8IE1ENV9BU0NJSV9MRU5HVEgpIHsKKyAgICAgICAgTE9HRSgiVGFyZ2V0IGhhc2ggYnVmZmVyIHNpemUgPCAlZCBieXRlcyAoJWQpIiwgTUQ1X0FTQ0lJX0xFTkdUSCwgbGVuKTsKICAgICAgICAgZXJybm8gPSBFU1BJUEU7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBNRDVfSW5pdCgmY3R4KTsKLSAgICBNRDVfVXBkYXRlKCZjdHgsIGlkLCBzdHJsZW4oaWQpKTsKLSAgICBNRDVfRmluYWwoc2lnLCAmY3R4KTsKKworICAgIE1ENShyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihpZCksIHN0cmxlbihpZCksIHNpZyk7CiAKICAgICBtZW1zZXQoYnVmZmVyLCAwLCBsZW4pOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNRDVfRElHRVNUX0xFTkdUSDsgaSsrKSB7CiAgICAgICAgIGNoYXIgdG1wWzNdOwogICAgICAgICBzbnByaW50Zih0bXAsIDMsICIlLjAyeCIsIHNpZ1tpXSk7CiAgICAgICAgIHN0cmNhdChidWZmZXIsIHRtcCk7CkBAIC01NzYsNiArNTc3LDcgQEAKICAgICAgICAgTE9HRSgiSGFzaCBvZiAnJXMnIGZhaWxlZCAoJXMpIiwgaWQsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CisKICAgICBjaGFyIGxvb3BEZXZpY2VbMjU1XTsKICAgICBpZiAoTG9vcDo6bG9va3VwQWN0aXZlKGlkSGFzaCwgbG9vcERldmljZSwgc2l6ZW9mKGxvb3BEZXZpY2UpKSkgewogICAgICAgICBpZiAoTG9vcDo6Y3JlYXRlKGlkSGFzaCwgYXNlY0ZpbGVOYW1lLCBsb29wRGV2aWNlLCBzaXplb2YobG9vcERldmljZSkpKSB7CmRpZmYgLS1naXQgYS9tZDUuYyBiL21kNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODc3ODZmLi4wMDAwMDAwCi0tLSBhL21kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgLSAyMDAxIEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgotICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIAotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAKLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLV9fUkNTSUQoIiRIZWltZGFsOiBtZDUuYyx2IDEuMTUgMjAwMS8wMS8yOSAwNDozMzo0NCBhc3NhciBFeHAgJCIKLSAgICAgICAgIiROZXRCU0Q6IG1kNS5jLHYgMS4xLjEuNCAyMDAyLzA5LzEyIDEyOjQxOjQyIGpvZGEgRXhwICQiKTsKLSNlbmRpZgotCi0jaW5jbHVkZSAibWQ1LmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotCi0jZGVmaW5lIEEgbS0+Y291bnRlclswXQotI2RlZmluZSBCIG0tPmNvdW50ZXJbMV0KLSNkZWZpbmUgQyBtLT5jb3VudGVyWzJdCi0jZGVmaW5lIEQgbS0+Y291bnRlclszXQotI2RlZmluZSBYIGRhdGEKLQotdm9pZAotTUQ1X0luaXQgKHN0cnVjdCBtZDUgKm0pCi17Ci0gIG0tPnN6WzBdID0gMDsKLSAgbS0+c3pbMV0gPSAwOwotICBEID0gMHgxMDMyNTQ3NjsKLSAgQyA9IDB4OThiYWRjZmU7Ci0gIEIgPSAweGVmY2RhYjg5OwotICBBID0gMHg2NzQ1MjMwMTsKLX0KLQotI2RlZmluZSBGKHgseSx6KSBDUkFZRklYKCh4ICYgeSkgfCAofnggJiB6KSkKLSNkZWZpbmUgRyh4LHkseikgQ1JBWUZJWCgoeCAmIHopIHwgKHkgJiB+eikpCi0jZGVmaW5lIEgoeCx5LHopICh4IF4geSBeIHopCi0jZGVmaW5lIEkoeCx5LHopIENSQVlGSVgoeSBeICh4IHwgfnopKQotCi0jZGVmaW5lIERPSVQoYSxiLGMsZCxrLHMsaSxPUCkgXAotYSA9IGIgKyBjc2hpZnQoYSArIE9QKGIsYyxkKSArIFhba10gKyAoaSksIHMpCi0KLSNkZWZpbmUgRE8xKGEsYixjLGQsayxzLGkpIERPSVQoYSxiLGMsZCxrLHMsaSxGKQotI2RlZmluZSBETzIoYSxiLGMsZCxrLHMsaSkgRE9JVChhLGIsYyxkLGsscyxpLEcpCi0jZGVmaW5lIERPMyhhLGIsYyxkLGsscyxpKSBET0lUKGEsYixjLGQsayxzLGksSCkKLSNkZWZpbmUgRE80KGEsYixjLGQsayxzLGkpIERPSVQoYSxiLGMsZCxrLHMsaSxJKQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWNhbGMgKHN0cnVjdCBtZDUgKm0sIHVfaW50MzJfdCAqZGF0YSkKLXsKLSAgdV9pbnQzMl90IEFBLCBCQiwgQ0MsIEREOwotCi0gIEFBID0gQTsKLSAgQkIgPSBCOwotICBDQyA9IEM7Ci0gIEREID0gRDsKLQotICAvKiBSb3VuZCAxICovCi0KLSAgRE8xKEEsQixDLEQsMCw3LDB4ZDc2YWE0NzgpOwotICBETzEoRCxBLEIsQywxLDEyLDB4ZThjN2I3NTYpOwotICBETzEoQyxELEEsQiwyLDE3LDB4MjQyMDcwZGIpOwotICBETzEoQixDLEQsQSwzLDIyLDB4YzFiZGNlZWUpOwotCi0gIERPMShBLEIsQyxELDQsNywweGY1N2MwZmFmKTsKLSAgRE8xKEQsQSxCLEMsNSwxMiwweDQ3ODdjNjJhKTsKLSAgRE8xKEMsRCxBLEIsNiwxNywweGE4MzA0NjEzKTsKLSAgRE8xKEIsQyxELEEsNywyMiwweGZkNDY5NTAxKTsKLQotICBETzEoQSxCLEMsRCw4LDcsMHg2OTgwOThkOCk7Ci0gIERPMShELEEsQixDLDksMTIsMHg4YjQ0ZjdhZik7Ci0gIERPMShDLEQsQSxCLDEwLDE3LDB4ZmZmZjViYjEpOwotICBETzEoQixDLEQsQSwxMSwyMiwweDg5NWNkN2JlKTsKLQotICBETzEoQSxCLEMsRCwxMiw3LDB4NmI5MDExMjIpOwotICBETzEoRCxBLEIsQywxMywxMiwweGZkOTg3MTkzKTsKLSAgRE8xKEMsRCxBLEIsMTQsMTcsMHhhNjc5NDM4ZSk7Ci0gIERPMShCLEMsRCxBLDE1LDIyLDB4NDliNDA4MjEpOwotCi0gIC8qIFJvdW5kIDIgKi8KLQotICBETzIoQSxCLEMsRCwxLDUsMHhmNjFlMjU2Mik7Ci0gIERPMihELEEsQixDLDYsOSwweGMwNDBiMzQwKTsKLSAgRE8yKEMsRCxBLEIsMTEsMTQsMHgyNjVlNWE1MSk7Ci0gIERPMihCLEMsRCxBLDAsMjAsMHhlOWI2YzdhYSk7Ci0KLSAgRE8yKEEsQixDLEQsNSw1LDB4ZDYyZjEwNWQpOwotICBETzIoRCxBLEIsQywxMCw5LDB4MjQ0MTQ1Myk7Ci0gIERPMihDLEQsQSxCLDE1LDE0LDB4ZDhhMWU2ODEpOwotICBETzIoQixDLEQsQSw0LDIwLDB4ZTdkM2ZiYzgpOwotCi0gIERPMihBLEIsQyxELDksNSwweDIxZTFjZGU2KTsKLSAgRE8yKEQsQSxCLEMsMTQsOSwweGMzMzcwN2Q2KTsKLSAgRE8yKEMsRCxBLEIsMywxNCwweGY0ZDUwZDg3KTsKLSAgRE8yKEIsQyxELEEsOCwyMCwweDQ1NWExNGVkKTsKLQotICBETzIoQSxCLEMsRCwxMyw1LDB4YTllM2U5MDUpOwotICBETzIoRCxBLEIsQywyLDksMHhmY2VmYTNmOCk7Ci0gIERPMihDLEQsQSxCLDcsMTQsMHg2NzZmMDJkOSk7Ci0gIERPMihCLEMsRCxBLDEyLDIwLDB4OGQyYTRjOGEpOwotCi0gIC8qIFJvdW5kIDMgKi8KLQotICBETzMoQSxCLEMsRCw1LDQsMHhmZmZhMzk0Mik7Ci0gIERPMyhELEEsQixDLDgsMTEsMHg4NzcxZjY4MSk7Ci0gIERPMyhDLEQsQSxCLDExLDE2LDB4NmQ5ZDYxMjIpOwotICBETzMoQixDLEQsQSwxNCwyMywweGZkZTUzODBjKTsKLQotICBETzMoQSxCLEMsRCwxLDQsMHhhNGJlZWE0NCk7Ci0gIERPMyhELEEsQixDLDQsMTEsMHg0YmRlY2ZhOSk7Ci0gIERPMyhDLEQsQSxCLDcsMTYsMHhmNmJiNGI2MCk7Ci0gIERPMyhCLEMsRCxBLDEwLDIzLDB4YmViZmJjNzApOwotCi0gIERPMyhBLEIsQyxELDEzLDQsMHgyODliN2VjNik7Ci0gIERPMyhELEEsQixDLDAsMTEsMHhlYWExMjdmYSk7Ci0gIERPMyhDLEQsQSxCLDMsMTYsMHhkNGVmMzA4NSk7Ci0gIERPMyhCLEMsRCxBLDYsMjMsMHg0ODgxZDA1KTsKLQotICBETzMoQSxCLEMsRCw5LDQsMHhkOWQ0ZDAzOSk7Ci0gIERPMyhELEEsQixDLDEyLDExLDB4ZTZkYjk5ZTUpOwotICBETzMoQyxELEEsQiwxNSwxNiwweDFmYTI3Y2Y4KTsKLSAgRE8zKEIsQyxELEEsMiwyMywweGM0YWM1NjY1KTsKLQotICAvKiBSb3VuZCA0ICovCi0KLSAgRE80KEEsQixDLEQsMCw2LDB4ZjQyOTIyNDQpOwotICBETzQoRCxBLEIsQyw3LDEwLDB4NDMyYWZmOTcpOwotICBETzQoQyxELEEsQiwxNCwxNSwweGFiOTQyM2E3KTsKLSAgRE80KEIsQyxELEEsNSwyMSwweGZjOTNhMDM5KTsKLQotICBETzQoQSxCLEMsRCwxMiw2LDB4NjU1YjU5YzMpOwotICBETzQoRCxBLEIsQywzLDEwLDB4OGYwY2NjOTIpOwotICBETzQoQyxELEEsQiwxMCwxNSwweGZmZWZmNDdkKTsKLSAgRE80KEIsQyxELEEsMSwyMSwweDg1ODQ1ZGQxKTsKLQotICBETzQoQSxCLEMsRCw4LDYsMHg2ZmE4N2U0Zik7Ci0gIERPNChELEEsQixDLDE1LDEwLDB4ZmUyY2U2ZTApOwotICBETzQoQyxELEEsQiw2LDE1LDB4YTMwMTQzMTQpOwotICBETzQoQixDLEQsQSwxMywyMSwweDRlMDgxMWExKTsKLQotICBETzQoQSxCLEMsRCw0LDYsMHhmNzUzN2U4Mik7Ci0gIERPNChELEEsQixDLDExLDEwLDB4YmQzYWYyMzUpOwotICBETzQoQyxELEEsQiwyLDE1LDB4MmFkN2QyYmIpOwotICBETzQoQixDLEQsQSw5LDIxLDB4ZWI4NmQzOTEpOwotCi0gIEEgKz0gQUE7Ci0gIEIgKz0gQkI7Ci0gIEMgKz0gQ0M7Ci0gIEQgKz0gREQ7Ci19Ci0KLS8qCi0gKiBGcm9tIGBQZXJmb3JtYW5jZSBhbmFseXNpcyBvZiBNRDUnIGJ5IEpvc2VwaCBELiBUb3VjaCA8dG91Y2hAaXNpLmVkdT4KLSAqLwotCi0jaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCi1zdGF0aWMgaW5saW5lIHVfaW50MzJfdAotc3dhcF91X2ludDMyX3QgKHVfaW50MzJfdCB0KQotewotICB1X2ludDMyX3QgdGVtcDEsIHRlbXAyOwotCi0gIHRlbXAxICAgPSBjc2hpZnQodCwgMTYpOwotICB0ZW1wMiAgID0gdGVtcDEgPj4gODsKLSAgdGVtcDEgICY9IDB4MDBmZjAwZmY7Ci0gIHRlbXAyICAmPSAweDAwZmYwMGZmOwotICB0ZW1wMSA8PD0gODsKLSAgcmV0dXJuIHRlbXAxIHwgdGVtcDI7Ci19Ci0jZW5kaWYKLQotc3RydWN0IHgzMnsKLSAgdW5zaWduZWQgaW50IGE6MzI7Ci0gIHVuc2lnbmVkIGludCBiOjMyOwotfTsKLQotdm9pZAotTUQ1X1VwZGF0ZSAoc3RydWN0IG1kNSAqbSwgY29uc3Qgdm9pZCAqdiwgc2l6ZV90IGxlbikKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHY7Ci0gIHNpemVfdCBvbGRfc3ogPSBtLT5zelswXTsKLSAgc2l6ZV90IG9mZnNldDsKLQotICBtLT5zelswXSArPSBsZW4gKiA4OwotICBpZiAobS0+c3pbMF0gPCBvbGRfc3opCi0gICAgICArK20tPnN6WzFdOwotICBvZmZzZXQgPSAob2xkX3N6IC8gOCkgICUgNjQ7Ci0gIHdoaWxlKGxlbiA+IDApewotICAgIHNpemVfdCBsID0gbWluKGxlbiwgNjQgLSBvZmZzZXQpOwotICAgIG1lbWNweShtLT5zYXZlICsgb2Zmc2V0LCBwLCBsKTsKLSAgICBvZmZzZXQgKz0gbDsKLSAgICBwICs9IGw7Ci0gICAgbGVuIC09IGw7Ci0gICAgaWYob2Zmc2V0ID09IDY0KXsKLSNpZiBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKLSAgICAgIGludCBpOwotICAgICAgdV9pbnQzMl90IGN1cnJlbnRbMTZdOwotICAgICAgc3RydWN0IHgzMiAqdSA9IChzdHJ1Y3QgeDMyKiltLT5zYXZlOwotICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKXsKLQljdXJyZW50WzIqaSswXSA9IHN3YXBfdV9pbnQzMl90KHVbaV0uYSk7Ci0JY3VycmVudFsyKmkrMV0gPSBzd2FwX3VfaW50MzJfdCh1W2ldLmIpOwotICAgICAgfQotICAgICAgY2FsYyhtLCBjdXJyZW50KTsKLSNlbHNlCi0gICAgICBjYWxjKG0sICh1X2ludDMyX3QqKW0tPnNhdmUpOwotI2VuZGlmCi0gICAgICBvZmZzZXQgPSAwOwotICAgIH0KLSAgfQotfQotCi12b2lkCi1NRDVfRmluYWwgKHZvaWQgKnJlcywgc3RydWN0IG1kNSAqbSkKLXsKLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgemVyb3NbNzJdOwotICB1bnNpZ25lZCBvZmZzZXQgPSAobS0+c3pbMF0gLyA4KSAlIDY0OwotICB1bnNpZ25lZCBpbnQgZHN0YXJ0ID0gKDEyMCAtIG9mZnNldCAtIDEpICUgNjQgKyAxOwotCi0gICp6ZXJvcyA9IDB4ODA7Ci0gIG1lbXNldCAoemVyb3MgKyAxLCAwLCBzaXplb2YoemVyb3MpIC0gMSk7Ci0gIHplcm9zW2RzdGFydCswXSA9IChtLT5zelswXSA+PiAwKSAmIDB4ZmY7Ci0gIHplcm9zW2RzdGFydCsxXSA9IChtLT5zelswXSA+PiA4KSAmIDB4ZmY7Ci0gIHplcm9zW2RzdGFydCsyXSA9IChtLT5zelswXSA+PiAxNikgJiAweGZmOwotICB6ZXJvc1tkc3RhcnQrM10gPSAobS0+c3pbMF0gPj4gMjQpICYgMHhmZjsKLSAgemVyb3NbZHN0YXJ0KzRdID0gKG0tPnN6WzFdID4+IDApICYgMHhmZjsKLSAgemVyb3NbZHN0YXJ0KzVdID0gKG0tPnN6WzFdID4+IDgpICYgMHhmZjsKLSAgemVyb3NbZHN0YXJ0KzZdID0gKG0tPnN6WzFdID4+IDE2KSAmIDB4ZmY7Ci0gIHplcm9zW2RzdGFydCs3XSA9IChtLT5zelsxXSA+PiAyNCkgJiAweGZmOwotICBNRDVfVXBkYXRlIChtLCB6ZXJvcywgZHN0YXJ0ICsgOCk7Ci0gIHsKLSAgICAgIGludCBpOwotICAgICAgdW5zaWduZWQgY2hhciAqciA9ICh1bnNpZ25lZCBjaGFyICopcmVzOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0JICByWzQqaV0gICA9IG0tPmNvdW50ZXJbaV0gJiAweEZGOwotCSAgcls0KmkrMV0gPSAobS0+Y291bnRlcltpXSA+PiA4KSAmIDB4RkY7Ci0JICByWzQqaSsyXSA9IChtLT5jb3VudGVyW2ldID4+IDE2KSAmIDB4RkY7Ci0JICByWzQqaSszXSA9IChtLT5jb3VudGVyW2ldID4+IDI0KSAmIDB4RkY7Ci0gICAgICB9Ci0gIH0KLSNpZiAwCi0gIHsKLSAgICBpbnQgaTsKLSAgICB1X2ludDMyX3QgKnIgPSAodV9pbnQzMl90ICopcmVzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKLSAgICAgIHJbaV0gPSBzd2FwX3VfaW50MzJfdCAobS0+Y291bnRlcltpXSk7Ci0gIH0KLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvbWQ1LmggYi9tZDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjYmI1Ny4uMDAwMDAwMAotLS0gYS9tZDUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgLSAyMDAxIEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgotICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIAotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAKLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qICRIZWltZGFsOiBtZDUuaCx2IDEuOCAyMDAxLzAxLzI5IDAyOjA4OjU3IGFzc2FyIEV4cCAkCi0gICAkTmV0QlNEOiBtZDUuaCx2IDEuMS4xLjQgMjAwMi8wOS8xMiAxMjo0MTo0MiBqb2RhIEV4cCAkICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1zdHJ1Y3QgbWQ1IHsKLSAgdW5zaWduZWQgaW50IHN6WzJdOwotICB1X2ludDMyX3QgY291bnRlcls0XTsKLSAgdW5zaWduZWQgY2hhciBzYXZlWzY0XTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IG1kNSBNRDVfQ1RYOwotCi12b2lkIE1ENV9Jbml0IChzdHJ1Y3QgbWQ1ICptKTsKLXZvaWQgTUQ1X1VwZGF0ZSAoc3RydWN0IG1kNSAqbSwgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IGxlbik7Ci12b2lkIE1ENV9GaW5hbCAodm9pZCAqcmVzLCBzdHJ1Y3QgbWQ1ICptKTsgLyogdV9pbnQzMl90IHJlc1s0XSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgo=