ZGlmZiAtLWdpdCBhL2xpYmMvYmlvbmljL21kNS5jIGIvbGliYy9iaW9uaWMvbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3Nzg2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmMvYmlvbmljL21kNS5jCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1IC0gMjAwMSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KKyAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorCitfX1JDU0lEKCIkSGVpbWRhbDogbWQ1LmMsdiAxLjE1IDIwMDEvMDEvMjkgMDQ6MzM6NDQgYXNzYXIgRXhwICQiCisgICAgICAgICIkTmV0QlNEOiBtZDUuYyx2IDEuMS4xLjQgMjAwMi8wOS8xMiAxMjo0MTo0MiBqb2RhIEV4cCAkIik7CisjZW5kaWYKKworI2luY2x1ZGUgIm1kNS5oIgorI2luY2x1ZGUgImhhc2guaCIKKworI2RlZmluZSBBIG0tPmNvdW50ZXJbMF0KKyNkZWZpbmUgQiBtLT5jb3VudGVyWzFdCisjZGVmaW5lIEMgbS0+Y291bnRlclsyXQorI2RlZmluZSBEIG0tPmNvdW50ZXJbM10KKyNkZWZpbmUgWCBkYXRhCisKK3ZvaWQKK01ENV9Jbml0IChzdHJ1Y3QgbWQ1ICptKQoreworICBtLT5zelswXSA9IDA7CisgIG0tPnN6WzFdID0gMDsKKyAgRCA9IDB4MTAzMjU0NzY7CisgIEMgPSAweDk4YmFkY2ZlOworICBCID0gMHhlZmNkYWI4OTsKKyAgQSA9IDB4Njc0NTIzMDE7Cit9CisKKyNkZWZpbmUgRih4LHkseikgQ1JBWUZJWCgoeCAmIHkpIHwgKH54ICYgeikpCisjZGVmaW5lIEcoeCx5LHopIENSQVlGSVgoKHggJiB6KSB8ICh5ICYgfnopKQorI2RlZmluZSBIKHgseSx6KSAoeCBeIHkgXiB6KQorI2RlZmluZSBJKHgseSx6KSBDUkFZRklYKHkgXiAoeCB8IH56KSkKKworI2RlZmluZSBET0lUKGEsYixjLGQsayxzLGksT1ApIFwKK2EgPSBiICsgY3NoaWZ0KGEgKyBPUChiLGMsZCkgKyBYW2tdICsgKGkpLCBzKQorCisjZGVmaW5lIERPMShhLGIsYyxkLGsscyxpKSBET0lUKGEsYixjLGQsayxzLGksRikKKyNkZWZpbmUgRE8yKGEsYixjLGQsayxzLGkpIERPSVQoYSxiLGMsZCxrLHMsaSxHKQorI2RlZmluZSBETzMoYSxiLGMsZCxrLHMsaSkgRE9JVChhLGIsYyxkLGsscyxpLEgpCisjZGVmaW5lIERPNChhLGIsYyxkLGsscyxpKSBET0lUKGEsYixjLGQsayxzLGksSSkKKworc3RhdGljIGlubGluZSB2b2lkCitjYWxjIChzdHJ1Y3QgbWQ1ICptLCB1X2ludDMyX3QgKmRhdGEpCit7CisgIHVfaW50MzJfdCBBQSwgQkIsIENDLCBERDsKKworICBBQSA9IEE7CisgIEJCID0gQjsKKyAgQ0MgPSBDOworICBERCA9IEQ7CisKKyAgLyogUm91bmQgMSAqLworCisgIERPMShBLEIsQyxELDAsNywweGQ3NmFhNDc4KTsKKyAgRE8xKEQsQSxCLEMsMSwxMiwweGU4YzdiNzU2KTsKKyAgRE8xKEMsRCxBLEIsMiwxNywweDI0MjA3MGRiKTsKKyAgRE8xKEIsQyxELEEsMywyMiwweGMxYmRjZWVlKTsKKworICBETzEoQSxCLEMsRCw0LDcsMHhmNTdjMGZhZik7CisgIERPMShELEEsQixDLDUsMTIsMHg0Nzg3YzYyYSk7CisgIERPMShDLEQsQSxCLDYsMTcsMHhhODMwNDYxMyk7CisgIERPMShCLEMsRCxBLDcsMjIsMHhmZDQ2OTUwMSk7CisKKyAgRE8xKEEsQixDLEQsOCw3LDB4Njk4MDk4ZDgpOworICBETzEoRCxBLEIsQyw5LDEyLDB4OGI0NGY3YWYpOworICBETzEoQyxELEEsQiwxMCwxNywweGZmZmY1YmIxKTsKKyAgRE8xKEIsQyxELEEsMTEsMjIsMHg4OTVjZDdiZSk7CisKKyAgRE8xKEEsQixDLEQsMTIsNywweDZiOTAxMTIyKTsKKyAgRE8xKEQsQSxCLEMsMTMsMTIsMHhmZDk4NzE5Myk7CisgIERPMShDLEQsQSxCLDE0LDE3LDB4YTY3OTQzOGUpOworICBETzEoQixDLEQsQSwxNSwyMiwweDQ5YjQwODIxKTsKKworICAvKiBSb3VuZCAyICovCisKKyAgRE8yKEEsQixDLEQsMSw1LDB4ZjYxZTI1NjIpOworICBETzIoRCxBLEIsQyw2LDksMHhjMDQwYjM0MCk7CisgIERPMihDLEQsQSxCLDExLDE0LDB4MjY1ZTVhNTEpOworICBETzIoQixDLEQsQSwwLDIwLDB4ZTliNmM3YWEpOworCisgIERPMihBLEIsQyxELDUsNSwweGQ2MmYxMDVkKTsKKyAgRE8yKEQsQSxCLEMsMTAsOSwweDI0NDE0NTMpOworICBETzIoQyxELEEsQiwxNSwxNCwweGQ4YTFlNjgxKTsKKyAgRE8yKEIsQyxELEEsNCwyMCwweGU3ZDNmYmM4KTsKKworICBETzIoQSxCLEMsRCw5LDUsMHgyMWUxY2RlNik7CisgIERPMihELEEsQixDLDE0LDksMHhjMzM3MDdkNik7CisgIERPMihDLEQsQSxCLDMsMTQsMHhmNGQ1MGQ4Nyk7CisgIERPMihCLEMsRCxBLDgsMjAsMHg0NTVhMTRlZCk7CisKKyAgRE8yKEEsQixDLEQsMTMsNSwweGE5ZTNlOTA1KTsKKyAgRE8yKEQsQSxCLEMsMiw5LDB4ZmNlZmEzZjgpOworICBETzIoQyxELEEsQiw3LDE0LDB4Njc2ZjAyZDkpOworICBETzIoQixDLEQsQSwxMiwyMCwweDhkMmE0YzhhKTsKKworICAvKiBSb3VuZCAzICovCisKKyAgRE8zKEEsQixDLEQsNSw0LDB4ZmZmYTM5NDIpOworICBETzMoRCxBLEIsQyw4LDExLDB4ODc3MWY2ODEpOworICBETzMoQyxELEEsQiwxMSwxNiwweDZkOWQ2MTIyKTsKKyAgRE8zKEIsQyxELEEsMTQsMjMsMHhmZGU1MzgwYyk7CisKKyAgRE8zKEEsQixDLEQsMSw0LDB4YTRiZWVhNDQpOworICBETzMoRCxBLEIsQyw0LDExLDB4NGJkZWNmYTkpOworICBETzMoQyxELEEsQiw3LDE2LDB4ZjZiYjRiNjApOworICBETzMoQixDLEQsQSwxMCwyMywweGJlYmZiYzcwKTsKKworICBETzMoQSxCLEMsRCwxMyw0LDB4Mjg5YjdlYzYpOworICBETzMoRCxBLEIsQywwLDExLDB4ZWFhMTI3ZmEpOworICBETzMoQyxELEEsQiwzLDE2LDB4ZDRlZjMwODUpOworICBETzMoQixDLEQsQSw2LDIzLDB4NDg4MWQwNSk7CisKKyAgRE8zKEEsQixDLEQsOSw0LDB4ZDlkNGQwMzkpOworICBETzMoRCxBLEIsQywxMiwxMSwweGU2ZGI5OWU1KTsKKyAgRE8zKEMsRCxBLEIsMTUsMTYsMHgxZmEyN2NmOCk7CisgIERPMyhCLEMsRCxBLDIsMjMsMHhjNGFjNTY2NSk7CisKKyAgLyogUm91bmQgNCAqLworCisgIERPNChBLEIsQyxELDAsNiwweGY0MjkyMjQ0KTsKKyAgRE80KEQsQSxCLEMsNywxMCwweDQzMmFmZjk3KTsKKyAgRE80KEMsRCxBLEIsMTQsMTUsMHhhYjk0MjNhNyk7CisgIERPNChCLEMsRCxBLDUsMjEsMHhmYzkzYTAzOSk7CisKKyAgRE80KEEsQixDLEQsMTIsNiwweDY1NWI1OWMzKTsKKyAgRE80KEQsQSxCLEMsMywxMCwweDhmMGNjYzkyKTsKKyAgRE80KEMsRCxBLEIsMTAsMTUsMHhmZmVmZjQ3ZCk7CisgIERPNChCLEMsRCxBLDEsMjEsMHg4NTg0NWRkMSk7CisKKyAgRE80KEEsQixDLEQsOCw2LDB4NmZhODdlNGYpOworICBETzQoRCxBLEIsQywxNSwxMCwweGZlMmNlNmUwKTsKKyAgRE80KEMsRCxBLEIsNiwxNSwweGEzMDE0MzE0KTsKKyAgRE80KEIsQyxELEEsMTMsMjEsMHg0ZTA4MTFhMSk7CisKKyAgRE80KEEsQixDLEQsNCw2LDB4Zjc1MzdlODIpOworICBETzQoRCxBLEIsQywxMSwxMCwweGJkM2FmMjM1KTsKKyAgRE80KEMsRCxBLEIsMiwxNSwweDJhZDdkMmJiKTsKKyAgRE80KEIsQyxELEEsOSwyMSwweGViODZkMzkxKTsKKworICBBICs9IEFBOworICBCICs9IEJCOworICBDICs9IENDOworICBEICs9IEREOworfQorCisvKgorICogRnJvbSBgUGVyZm9ybWFuY2UgYW5hbHlzaXMgb2YgTUQ1JyBieSBKb3NlcGggRC4gVG91Y2ggPHRvdWNoQGlzaS5lZHU+CisgKi8KKworI2lmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQorc3RhdGljIGlubGluZSB1X2ludDMyX3QKK3N3YXBfdV9pbnQzMl90ICh1X2ludDMyX3QgdCkKK3sKKyAgdV9pbnQzMl90IHRlbXAxLCB0ZW1wMjsKKworICB0ZW1wMSAgID0gY3NoaWZ0KHQsIDE2KTsKKyAgdGVtcDIgICA9IHRlbXAxID4+IDg7CisgIHRlbXAxICAmPSAweDAwZmYwMGZmOworICB0ZW1wMiAgJj0gMHgwMGZmMDBmZjsKKyAgdGVtcDEgPDw9IDg7CisgIHJldHVybiB0ZW1wMSB8IHRlbXAyOworfQorI2VuZGlmCisKK3N0cnVjdCB4MzJ7CisgIHVuc2lnbmVkIGludCBhOjMyOworICB1bnNpZ25lZCBpbnQgYjozMjsKK307CisKK3ZvaWQKK01ENV9VcGRhdGUgKHN0cnVjdCBtZDUgKm0sIGNvbnN0IHZvaWQgKnYsIHNpemVfdCBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSB2OworICBzaXplX3Qgb2xkX3N6ID0gbS0+c3pbMF07CisgIHNpemVfdCBvZmZzZXQ7CisKKyAgbS0+c3pbMF0gKz0gbGVuICogODsKKyAgaWYgKG0tPnN6WzBdIDwgb2xkX3N6KQorICAgICAgKyttLT5zelsxXTsKKyAgb2Zmc2V0ID0gKG9sZF9zeiAvIDgpICAlIDY0OworICB3aGlsZShsZW4gPiAwKXsKKyAgICBzaXplX3QgbCA9IG1pbihsZW4sIDY0IC0gb2Zmc2V0KTsKKyAgICBtZW1jcHkobS0+c2F2ZSArIG9mZnNldCwgcCwgbCk7CisgICAgb2Zmc2V0ICs9IGw7CisgICAgcCArPSBsOworICAgIGxlbiAtPSBsOworICAgIGlmKG9mZnNldCA9PSA2NCl7CisjaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisgICAgICBpbnQgaTsKKyAgICAgIHVfaW50MzJfdCBjdXJyZW50WzE2XTsKKyAgICAgIHN0cnVjdCB4MzIgKnUgPSAoc3RydWN0IHgzMiopbS0+c2F2ZTsKKyAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKyl7CisJY3VycmVudFsyKmkrMF0gPSBzd2FwX3VfaW50MzJfdCh1W2ldLmEpOworCWN1cnJlbnRbMippKzFdID0gc3dhcF91X2ludDMyX3QodVtpXS5iKTsKKyAgICAgIH0KKyAgICAgIGNhbGMobSwgY3VycmVudCk7CisjZWxzZQorICAgICAgY2FsYyhtLCAodV9pbnQzMl90KiltLT5zYXZlKTsKKyNlbmRpZgorICAgICAgb2Zmc2V0ID0gMDsKKyAgICB9CisgIH0KK30KKwordm9pZAorTUQ1X0ZpbmFsICh2b2lkICpyZXMsIHN0cnVjdCBtZDUgKm0pCit7CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHplcm9zWzcyXTsKKyAgdW5zaWduZWQgb2Zmc2V0ID0gKG0tPnN6WzBdIC8gOCkgJSA2NDsKKyAgdW5zaWduZWQgaW50IGRzdGFydCA9ICgxMjAgLSBvZmZzZXQgLSAxKSAlIDY0ICsgMTsKKworICAqemVyb3MgPSAweDgwOworICBtZW1zZXQgKHplcm9zICsgMSwgMCwgc2l6ZW9mKHplcm9zKSAtIDEpOworICB6ZXJvc1tkc3RhcnQrMF0gPSAobS0+c3pbMF0gPj4gMCkgJiAweGZmOworICB6ZXJvc1tkc3RhcnQrMV0gPSAobS0+c3pbMF0gPj4gOCkgJiAweGZmOworICB6ZXJvc1tkc3RhcnQrMl0gPSAobS0+c3pbMF0gPj4gMTYpICYgMHhmZjsKKyAgemVyb3NbZHN0YXJ0KzNdID0gKG0tPnN6WzBdID4+IDI0KSAmIDB4ZmY7CisgIHplcm9zW2RzdGFydCs0XSA9IChtLT5zelsxXSA+PiAwKSAmIDB4ZmY7CisgIHplcm9zW2RzdGFydCs1XSA9IChtLT5zelsxXSA+PiA4KSAmIDB4ZmY7CisgIHplcm9zW2RzdGFydCs2XSA9IChtLT5zelsxXSA+PiAxNikgJiAweGZmOworICB6ZXJvc1tkc3RhcnQrN10gPSAobS0+c3pbMV0gPj4gMjQpICYgMHhmZjsKKyAgTUQ1X1VwZGF0ZSAobSwgemVyb3MsIGRzdGFydCArIDgpOworICB7CisgICAgICBpbnQgaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKnIgPSAodW5zaWduZWQgY2hhciAqKXJlczsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCSAgcls0KmldICAgPSBtLT5jb3VudGVyW2ldICYgMHhGRjsKKwkgIHJbNCppKzFdID0gKG0tPmNvdW50ZXJbaV0gPj4gOCkgJiAweEZGOworCSAgcls0KmkrMl0gPSAobS0+Y291bnRlcltpXSA+PiAxNikgJiAweEZGOworCSAgcls0KmkrM10gPSAobS0+Y291bnRlcltpXSA+PiAyNCkgJiAweEZGOworICAgICAgfQorICB9CisjaWYgMAorICB7CisgICAgaW50IGk7CisgICAgdV9pbnQzMl90ICpyID0gKHVfaW50MzJfdCAqKXJlczsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICByW2ldID0gc3dhcF91X2ludDMyX3QgKG0tPmNvdW50ZXJbaV0pOworICB9CisjZW5kaWYKK30K