ZGlmZiAtLWdpdCBhL2Jvb3QvY29tbW9uL3NyYy9sb2FkZXIvZHJpdmVycy9zcGlmYy5jIGIvYm9vdC9jb21tb24vc3JjL2xvYWRlci9kcml2ZXJzL3NwaWZjLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzcwM2VmZAotLS0gL2Rldi9udWxsCisrKyBiL2Jvb3QvY29tbW9uL3NyYy9sb2FkZXIvZHJpdmVycy9zcGlmYy5jCkBAIC0wLDAgKzEsODY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQ29weXJpZ2h0IDIwMTYgYnkgIFpYSUMgQ29ycG9yYXRpb24uCisqCisqIEZpbGVOYW1lOjogICAgc3BpZmMuYworKiBGaWxlIE1hcms6CisqIERlc2NyaXB0aW9uOiAgCisqIE90aGVyczoKKyogVmVyc2lvbjogIAorKiBBdXRob3I6ICAKKyogRGF0ZTogICAKKworKiBIaXN0b3J5IDE6CisqICAgICBEYXRlOiAKKyogICAgIFZlcnNpb246CisqICAgICBBdXRob3I6IAorKiAgICAgTW9kaWZpY2F0aW9uOgorKiBIaXN0b3J5IDI6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3NwaWZjLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YmJ0Lmg+CisKKyNpbmNsdWRlICJmbGFzaC5oIgorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2ZsYXNoX2RldmljZV9wYXJhICpzcGlfZmxhc2hfaW5mbyA9IE5VTEw7CisvKiBzcGkgZmxhc2ggcGFyYW1ldGVyIGNvbmZpZyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZmxhc2hfZGV2aWNlX3BhcmEgc3BpX2ZsYXNoX3BhcmFbXSA9IHsKKwkvKiBHSUdBREVWSUNFIEdENUYxR1E0UiAxMjhNQiAxLjhWIFNQSS1OQU5EICovCisJezB4QzgsIDB4QzEsIDB4NzcsIDIwNDgsIDExLCAxMjgsIDE3LCAxMDI0LCAweDIwMDAwLCAxfSwKKwkvKiBHSUdBREVWSUNFIEdENUYxR1E1UkV4eEcgIDEyOE1CIDEuOFYgU1BJLU5BTkQgKi8KKwl7MHhDOCwgMHg0MSwgMHg3NywgMjA0OCwgMTEsIDY0LCAxNywgMTAyNCwgMHgyMDAwMCwgMX0sCisJLyogR0lHQURFVklDRSBHRDVGMkdRNFIgMjU2TUIgU1BJLU5BTkQgKi8JCisJezB4QzgsIDB4QzIsIDB4NzcsIDIwNDgsIDExLCAxMjgsIDE3LCAyMDQ4LCAweDIwMDAwLCAxfSwgCisJLyogR0lHQURFVklDRSBHRDVGNEdRNFUgNTEyTUIgU1BJLU5BTkQgKi8KKwl7MHhDOCwgMHhDNCwgMHg3NywgNDA5NiwgMTIsIDI1NiwgMTgsIDIwNDgsIDB4NDAwMDAsIDF9LAorCisJLyogUEFSQUdPTiBQTjI2UTAxQVdTSVVHIDEyOE1CIFNQSS1OQU5EICovCQorCXsweEExLCAweEMxLCAweDc3LCAyMDQ4LCAxMSwgMTI4LCAxNywgMTAyNCwgMHgyMDAwMCwgMX0sCisJLyogUE4yNlEwMkFXU0lVRyAxLjhWIDJHLUJJVCBTUEkgTkFORCAgKi8JCisJezB4QTEsIDB4QzIsIDB4NzcsIDIwNDgsIDExLCAxMjgsIDE3LCAyMDQ4LCAweDIwMDAwLCAxfSwKKworCS8qIEhZRjFHUTRJQUFDQUUgU1BJLU5BTkQgICovCQorCXsweEM5LCAweDUxLCAweDc3LCAyMDQ4LCAxMSwgMTI4LCAxNywgMTAyNCwgMHgyMDAwMCwgMX0sCisJLyogSFlGMkdRNElBQUNBRSBTUEktTkFORCAgKi8JCisJezB4QzksIDB4NTIsIDB4NzcsIDIwNDgsIDExLCAxMjgsIDE3LCAyMDQ4LCAweDIwMDAwLCAxfSwKKwkvKndpbmJvbmQgVzI1TjAxRyovCisJezB4RUYsIDB4QkEsIDB4NzcsIDIwNDgsIDExLCA2NCwgMTcsIDEwMjQsIDB4MjAwMDAsIDF9LAorCS8qd2luYm9uZCBXMjVOMDJHKi8KKwl7MHhFRiwgMHhCQiwgMHg3NywgMjA0OCwgMTEsIDY0LCAxNywgMjA0OCwgMHgyMDAwMCwgMX0sCQkKKwkvKiBUT1NISUJBIFRDNThDWUcwUzNIUkFJRyAxMjhNQiBTUEktTkFORCovCisJezB4OTgsIDB4QjIsIDB4NzcsIDIwNDgsIDExLCA2NCwgMTcsIDEwMjQsIDB4MjAwMDAsIDF9LAorCS8qIFRPU0hJQkEgVEM1OENZRzFTM0hSQUlHIDI1Nk1CIFNQSS1OQU5EKi8KKwl7MHg5OCwgMHhCQiwgMHg3NywgMjA0OCwgMTEsIDY0LCAxNywgMjA0OCwgMHgyMDAwMCwgMX0sCisJLyogWkVUVEEgWkQzNVgxR0FYWFggMTI4TUIgU1BJLU5BTkQqLworCXsweEJBLCAweDIxLCAweDc3LCAyMDQ4LCAxMSwgNjQsIDE3LCAxMDI0LCAweDIwMDAwLCAxfSwKKwkvKiBET1NJTElDT04gRFMzNVgxR0FYWFggMTI4TUIgU1BJLU5BTkQqLworCXsweEU1LCAweDIxLCAweDc3LCAyMDQ4LCAxMSwgNjQsIDE3LCAxMDI0LCAweDIwMDAwLCAxfSwKKwkvKiBET1NJTElDT04gRFMzNVgxMkJYWFggNjRNQiBTUEktTkFORCovCisJezB4RTUsIDB4QTUsIDB4NzcsIDIwNDgsIDExLCAxMjgsIDE3LCA1MTIsIDB4MjAwMDAsIDF9LAorCS8qIEZVREFOV0VJIEZNMjVMUzAxIDEyOE1CIFNQSS1OQU5EKi8KKwl7MHhBMSwgMHhBNSwgMHg3NywgMjA0OCwgMTEsIDEyOCwgMTcsIDEwMjQsIDB4MjAwMDAsIDF9LAorCS8qIGhvc2luICBIRy1TUElYR2ItMVhBSUEgMTI4TUIgU1BJLU5BTkQqLworCXsweEQ2LCAweDIxLCAweDc3LCAyMDQ4LCAxMSwgNjQsIDE3LCAxMDI0LCAweDIwMDAwLCAxfSwKKwkvKiBFTVNUIEY1MEQxRzQxTEIgKDJNKSAxMjhNQiBTUEktTkFORCAqLworCXsweEM4LCAweDExLCAweDc3LCAyMDQ4LCAxMSwgNjQsIDE3LCAxMDI0LCAweDIwMDAwLCAxfSwKKwkvKiBGT1JFU0VFIEYzNVVRQTAwMUcgMTI4TUIgU1BJLU5BTkQgKi8KKwl7MHhDRCwgMHg2MSwgMHg3NywgMjA0OCwgMTEsIDY0LCAxNywgMTAyNCwgMHgyMDAwMCwgMX0sCisJLyogRk9SRVNFRSBGMzVVUUE1MTJNIDY0TUIgU1BJLU5BTkQgKi8KKwl7MHhDRCwgMHg2MCwgMHg3NywgMjA0OCwgMTEsIDY0LCAxNywgNTEyLCAweDIwMDAwLCAxfSwKKwkvKiBtaWNyb24tTVQyOUYyRzAxQUJBR0RXQi1JVEcgMjU2TUIgU1BJLU5BTkQgKi8KKwl7MHgyQywgMHgyNSwgMHg3NywgMjA0OCwgMTEsIDEyOCwgMTcsIDIwNDgsIDB4MjAwMDAsIDJ9LAorCS8qIEVTTVQgRjUwRDQ0RzQxWEIgKDJYKSAgNTEyTUIgU1BJLU5BTkQqLworCXsweDJDLCAweDM1LCAweDc3LCA0MDk2LCAxMiwgMjU2LCAxOCwgMjA0OCwgMHg0MDAwMCwgMX0sCisJezB9Cit9OworCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogICAgc3BpZmNfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogCisgKiBQYXJhbWV0ZXJzOgorICoJIElucHV0OgorICoJIE91dHB1dDoKKyAqIFJldHVybnM6CisgKiBPdGhlcnM6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBzcGlmY19lbmFibGUodm9pZCkKK3sKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qgc3BpX3QqIHNwaQk9IChzdHJ1Y3Qgc3BpX3QqKVNZU19TUElfTkFORF9CQVNFOworICAgIAorICAgIGlmKCBzcGktPlNGQ19FTiAmIEZDX0VOX0JBQ0sgKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgc3BpLT5TRkNfRU4gfD0gRkNfRU47ICAKKyAgICBzcGktPlNGQ19DVFJMMCB8PSBGQ19TQ0xLX1BBVVNFX0VOOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgIHNwaWZjX2NsZWFyX2ZpZm8KKyAqIERlc2NyaXB0aW9uOiAKKyAqIFBhcmFtZXRlcnM6CisgKgkgSW5wdXQ6CisgKgkgT3V0cHV0OgorICogUmV0dXJuczoKKyAqIE90aGVyczoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3ZvaWQgc3BpZmNfY2xlYXJfZmlmbyggdm9pZCApCit7CisgICAgdm9sYXRpbGUgc3RydWN0IHNwaV90KiBzcGkJPSAoc3RydWN0IHNwaV90KilTWVNfU1BJX05BTkRfQkFTRTsKKyAgICAKKyAgICBzcGktPlNGQ19DVFJMMCB8PSAoRkNfUlhGSUZPX1RIUkVTIHwgRkNfVFhGSUZPX1RIUkVTIHwgCisgICAgICAgICAgICAgICAgICAgICAgIEZDX1JYRklGT19DTFIgfCBGQ19UWEZJRk9fQ0xSKTsKK30KKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgIHNwaWZjX3NldHVwX2NtZAorICogRGVzY3JpcHRpb246IAorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCSBPdXRwdXQ6CisgKiBSZXR1cm5zOgorICogT3RoZXJzOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHZvaWQgc3BpZmNfc2V0dXBfY21kKCBzdHJ1Y3Qgc3BpZmxhc2hfY21kX3QgKmNtZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWRkciwgdWludDMyX3QgbGVuICkKK3sgICAKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qgc3BpX3QqIHNwaQk9IChzdHJ1Y3Qgc3BpX3QqKVNZU19TUElfTkFORF9CQVNFOworICAgIHVpbnQzMl90IHdyYXAgPSAwOwkKKyAgICB1aW50MzJfdCB0bXAgPSAwOworCQorICAgIC8qIMP8we7C6yAqLyAgCisgICAgc3BpLT5TRkNfSU5TID0gY21kLT5jbWQ7CisKKwkvKiDK/b7ds6S2yCAqLworICAgIGlmKCBsZW4gKQorICAgICAgICBzcGktPlNGQ19CWVRFX05VTSA9IGxlbiAtIDE7CisgICAgZWxzZQorICAgICAgICBzcGktPlNGQ19CWVRFX05VTSA9IDA7ICAKKworICAgIHN3aXRjaCggbGVuICkKKyAgICB7CisgICAgICAgIGNhc2UgMjA0ODoKKyAgICAgICAgICAgIHdyYXAgPSBXUkFQX1NJWkVfTUFJTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIxMTI6CisgICAgICAgICAgICAgd3JhcCA9IFdSQVBfU0laRV9NQUlOX09PQjs7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgICAgICB3cmFwID0gV1JBUF9TSVpFX09PQjs7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdyYXAgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogtdjWt8LrICovCisgICAgc3dpdGNoKCBzcGktPlNGQ19JTlMgKQorICAgIHsKKyAgICAgICAgY2FzZSBDTURfUkVBRF9GUk9NX0NBQ0hFOgorICAgICAgICAvLyAgY2FzZSBDTURfUkVBRF9GUk9NX0NBQ0hFX1gyOgorICAgICAgICBjYXNlIENNRF9SRUFEX0ZST01fQ0FDSEVfWDQ6CisgICAgICAgIGNhc2UgQ01EX1JFQURfRlJPTV9DQUNIRV9RSU86CisgICAgICAgIGNhc2UgQ01EX1BST0dSQU1fTE9BRDoKKyAgICAgICAgY2FzZSBDTURfUFJPR1JBTV9MT0FEX1g0OgorICAgICAgICAgICAgLy8gY2FzZSBDTURfUFJPR1JBTV9MT0FEX1JBTkRPTToKKyAgICAgICAgICAgIC8vICBjYXNlIENNRF9QUk9HUkFNX0xPQURfUkFORE9NX1g0OgorICAgICAgICAgICAgLy9jYXNlIENNRF9QUk9HUkFNX0xPQURfUkFORE9NX1FJTzoKKyAgICAgICAgICAgIGFkZHIgfD0gd3JhcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhZGRyID0gYWRkcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzcGktPlNGQ19BRERSID0gYWRkcjsgIAorCisgICAgLyogtdjWt8LroaK/1dbcxtqhorbBL9C0IMq5xNzJ6NbDICovCisgICAgc3BpLT5TRkNfQ1RSTDEgPSAwOworICAgIHNwaS0+U0ZDX0NUUkwxID0gKChjbWQtPmFkZHJfdHhfZW4gPDwgRkNfQUREUl9UWF9FTikgfCAgCisgICAgICAgICAgICAgICAgICAgICAgKGNtZC0+ZHVteV90eF9lbiA8PCBGQ19EVU1NWV9UWF9FTikgfCAKKyAgICAgICAgICAgICAgICAgICAgICAoY21kLT5kYXRhX3J4X2VuIDw8IEZDX1JFQURfREFUX0VOKSB8IAorICAgICAgICAgICAgICAgICAgICAgIChjbWQtPmRhdGFfdHhfZW4gPDwgRkNfV1JJVEVfREFUX0VOKSk7IAorICAgICAgICAgICAgICAgICAgICAKKworCS8qIL/V1tzG2sr9oaK12Na3v+22yCgxo6wyo6wzo6w019a92imhogorCSAqILXY1rcvyv2+3c/ftsihorSryuTEo8q9IAorCSAqLworI2lmIDAKKyAgICB0bXAgPSBzcGktPlNGQ19DVFJMMjsKKyAgICB0bXAgJj0gMHgxZjsKKyAgICB0bXAgfD0gKChjbWQtPmR1bXlfYnl0ZXMgPDwgRkNfRFVNTVlfQllURV9OVU0pIHwKKyAgICAgICAgICAgIChjbWQtPmR1bXlfYml0cyA8PCBGQ19EVU1NWV9CSVRfTlVNKSB8CisgICAgICAgICAgICAoY21kLT5hZGRyX3dpZHRoIDw8IEZDX0FERFJfQllURV9OVU0pKTsKKyAgICBzcGktPlNGQ19DVFJMMiA9IHRtcDsKKyNlbHNlCisJc3BpLT5TRkNfQ1RSTDIgPSAwOworCXRtcCB8PSAoKGNtZC0+ZHVteV9ieXRlcyA8PCBGQ19EVU1NWV9CWVRFX05VTSkgfAorCQkJKGNtZC0+ZHVteV9iaXRzIDw8IEZDX0RVTU1ZX0JJVF9OVU0pIHwKKwkJCShjbWQtPmFkZHJfd2lkdGggPDwgRkNfQUREUl9CWVRFX05VTSkpOworCXRtcCAmPSB+MHg3MDA7CisJc3BpLT5TRkNfQ1RSTDIgPSB0bXA7CisjZW5kaWYKKyAgICAgICAKK30KKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgIHNwaWZjX2NsZWFyX2ludAorICogRGVzY3JpcHRpb246IAorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCSBPdXRwdXQ6CisgKiBSZXR1cm5zOgorICogT3RoZXJzOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworIHZvaWQgc3BpZmNfY2xlYXJfaW50KCB2b2lkICkKK3sKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qgc3BpX3QqIHNwaQk9IChzdHJ1Y3Qgc3BpX3QqKVNZU19TUElfTkFORF9CQVNFOworICAgIAorICAgIGlmKHNwaS0+U0ZDX0lOVF9SQVcgJiAweDIpCisgICAgICAgIHByaW50ZigiXG4iKTsKKworICAgIHNwaS0+U0ZDX0lOVF9TV19DTFIgPSAweEZGOyAvL2NsZWFyIGludCA/Cit9CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiAgICBzcGlmY193YWl0X2NtZF9lbmQKKyAqIERlc2NyaXB0aW9uOiAKKyAqIFBhcmFtZXRlcnM6CisgKgkgSW5wdXQ6CisgKgkgT3V0cHV0OgorICogUmV0dXJuczoKKyAqIE90aGVyczoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbnQgc3BpZmNfd2FpdF9jbWRfZW5kKCB2b2lkICkKK3sKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qgc3BpX3QqIHNwaQk9IChzdHJ1Y3Qgc3BpX3QqKVNZU19TUElfTkFORF9CQVNFOworICAgIHVpbnQzMl90IGludF9zdGF0dXMgPSAwOworICAgIAorICAgIHdoaWxlKCEoc3BpLT5TRkNfSU5UX1JBVyAmIEZDX0lOVF9SQVdfTUFTSykpOworICAgIAorICAgIGludF9zdGF0dXMgPSBzcGktPlNGQ19JTlRfUkFXOworICAgIHNwaS0+U0ZDX0lOVF9TV19DTFIgPSBpbnRfc3RhdHVzOwkvKiBjbGVhciBpbnRycnVwdCAqLworCisJaWYoaW50X3N0YXR1cyAmIEZDX0lOVF9SQVdfQ01EX0VORCkKKyAgICB7ICAgCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworCQlwcmludGYoImludHIgZXJyLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IAorCit9CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiAgICBzcGlmY19yZWFkX2ZpZm9fb25lX2J5dGUKKyAqIERlc2NyaXB0aW9uOiAKKyAqIFBhcmFtZXRlcnM6CisgKgkgSW5wdXQ6CisgKgkgT3V0cHV0OgorICogUmV0dXJuczoKKyAqCisgKiBPdGhlcnM6ICBvbmx5IGZvcjoKKyAgICAgICAgICAgICAgICBbSW5zdHJ1Y3Rpb25dICAgICAgICAgICAgICAgICB8LS1hZGRyIHdpZHRoIGlzIDggYml0CisgICAgICAgICAgICAgICAgW2FkZHJdICAgICAgICAgICAgICAgICAgICAgICAgfC0tZ2V0IGZlYXR1cmUKKyAgICAgICAgICAgICAgICBbZGF0YV9yeF0gICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbnQgc3BpZmNfcmVhZF9maWZvX29uZV9ieXRlKCB1aW50OF90ICp2YWx1ZSApCit7CisgICAgdWludDMyX3Qgc3cgPSAwOworICAgIHZvbGF0aWxlIHN0cnVjdCBzcGlfdCogc3BpCT0gKHN0cnVjdCBzcGlfdCopU1lTX1NQSV9OQU5EX0JBU0U7CisKKyAgICBzdyA9IHNwaS0+U0ZDX1NXOworICAgIAorICAgIGlmKCAoKHN3ID4+IEZDX1JYX0ZJRk9fQ05UKSAmIEZDX1JYX0ZJRk9fQ05UX01BU0spICE9IDEgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgICp2YWx1ZSA9ICh1aW50OF90KXNwaS0+U0ZDX0RBVEE7ICAgCisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiAgICBzcGlmY19yZWFkX2ZpZm8KKyAqIERlc2NyaXB0aW9uOgorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCSBPdXRwdXQ6CisgKiBSZXR1cm5zOgorICogT3RoZXJzOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHVpbnQzMl90IHNwaWZjX3JlYWRfZmlmbyggdWludDMyX3QgbGVuLCB1aW50OF90ICpidWYgKQoreworICAgIHZvbGF0aWxlIHN0cnVjdCBzcGlfdCogc3BpCT0gKHN0cnVjdCBzcGlfdCopU1lTX1NQSV9OQU5EX0JBU0U7CisgICAgdWludDMyX3QgKnAgPSAodWludDMyX3QgKilidWY7CisgICAgdWludDMyX3QgY250ID0gMDsKKworICAgIHdoaWxlKGNudCA8ICgobGVuKzMpPj4yKSkgIAorICAgIHsKKyAgICAgICAgaWYoc3BpLT5TRkNfU1cgJiAoRkNfUlhfRklGT19DTlRfTUFTSzw8RkNfUlhfRklGT19DTlQpKS8vcnggZmlmbyBub3QgZW1wdHkKKyAgICAgICAgeyAgICAgICAgICAgCisgICAgICAgICAgICBwW2NudCsrXT0gc3BpLT5TRkNfREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoY250PDwyKTsKK30KKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgIHNwaWZjX3N0YXJ0CisgKiBEZXNjcmlwdGlvbjogCisgKiBQYXJhbWV0ZXJzOgorICoJIElucHV0OgorICoJIE91dHB1dDoKKyAqIFJldHVybnM6CisgKiBPdGhlcnM6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBzcGlmY19zdGFydCggdm9pZCApCit7CisgICAgdm9sYXRpbGUgc3RydWN0IHNwaV90KiBzcGkJPSAoc3RydWN0IHNwaV90KilTWVNfU1BJX05BTkRfQkFTRTsKKyAgICAKKyAgICBzcGktPlNGQ19TVEFSVCB8PSBGQ19TVEFSVDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiAgICBzcGlmY19nZXRfZmVhdHVyZQorICogRGVzY3JpcHRpb246IAorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCSBPdXRwdXQ6CisgKiBSZXR1cm5zOgorICoKKyAqIE90aGVyczogICBbSW5zdHJ1Y3Rpb25dICAgICAgICAgICAgICAgICB8LS1hZGRyIHdpZHRoIGlzIDggYml0CisgICAgICAgICAgICAgW2FkZHJdICAgICAgICAgICAgICAgICAgICAgICAgfC0tZ2V0IGZlYXR1cmUKKyAgICAgICAgICAgICBbZGF0YV9yeF0gICAgICAgICAgICAgICAgICAgICB8LS1yZWFkIGlkCisgICAgICAgICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyBzdGF0aWMgaW50IHNwaWZjX2dldF9mZWF0dXJlKCB1aW50MzJfdCByZWdfYWRkciwgdWludDhfdCAqdmFsdWUpCisgeyAgIAorICAgIGludCByZXQgPSAwOworICAgIAorICAgIHN0cnVjdCBzcGlmbGFzaF9jbWRfdCBjbWQgPSB7Q01EX0dFVF9GRUFUVVJFLAkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkNfQUREUl9CWVRFX05VTV84LCAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgc3BpZmNfY2xlYXJfZmlmbygpOworICAgIHNwaWZjX2NsZWFyX2ludCgpOworICAgICAKKyAgICBzcGlmY19zZXR1cF9jbWQoJmNtZCwgcmVnX2FkZHIsIDEpOworICAgIHNwaWZjX3N0YXJ0KCk7ICAgICAgICAgICAgIAorICAgIHJldCA9IHNwaWZjX3dhaXRfY21kX2VuZCgpOworICAgIGlmKHJldCAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBzcGlmY19yZWFkX2ZpZm9fb25lX2J5dGUodmFsdWUpOworICAgIGlmKHJldCAhPSAwKSAKKyAgICB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiAgICBzcGlmY19yZWFkX2lkCisgKiBEZXNjcmlwdGlvbjogCisgKiBQYXJhbWV0ZXJzOgorICoJIElucHV0OgorICoJIE91dHB1dDoKKyAqIFJldHVybnM6CisgKgorICogT3RoZXJzOiAgW0luc3RydWN0aW9uXSAgICAgICAgICAgICAgICAgfC0tYWRkciB3aWR0aCBpcyA4IGJpdAorICAgICAgICAgICAgW2FkZHJdICAgICAgICAgICAgICAgICAgICAgICAgfC0tZ2V0IGZlYXR1cmUKKyAgICAgICAgICAgIFtkYXRhX3J4XSAgICAgICAgICAgICAgICAgICAgIHwtLXJlYWQgaWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbnQgc3BpZmNfcmVhZF9pZCh1aW50MzJfdCByZWdfYWRkciwgdWludDhfdCAqdmFsdWUsIHVpbnQ4X3QgbGVuKQoreyAgIAorICAgIGludCByZXQgPSAwOworICAgIAorICAgIHN0cnVjdCBzcGlmbGFzaF9jbWRfdCBjbWQgPSB7ICAgQ01EX1JFQURfSUQsICAgICAgICAgICAgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZDX0FERFJfQllURV9OVU1fOCwgICAgIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICBzcGlmY19jbGVhcl9maWZvKCk7CisgICAgc3BpZmNfY2xlYXJfaW50KCk7CisgICAgc3BpZmNfc2V0dXBfY21kKCZjbWQsIHJlZ19hZGRyLCBsZW4pOyAgICAgICAKKyAgICBzcGlmY19zdGFydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJcmV0ID0gc3BpZmNfd2FpdF9jbWRfZW5kKCk7ICAgICAgICAgICAgCisgICAgaWYocmV0ICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHNwaWZjX3JlYWRfZmlmbyhsZW4sIHZhbHVlKTsgICAgCisgICAgaWYocmV0ICE9IDApIAorICAgIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9ICAgCisKKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgIHNwaWZjX3JlYWRfcGFnZV90b19jYWNoZQorICogRGVzY3JpcHRpb246IAorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCSBPdXRwdXQ6CisgKiBSZXR1cm5zOgorICogT3RoZXJzOiAgW0luc3RydWN0aW9uXSAgICAgICB8LS1hZGRyIHdpZHRoIGlzIDI0IGJpdChwYWdlL2Jsb2NrIGFkZHIhISEhKQorICAgICAgICAgICAgW2FkZHJdICAgICAgICAgICAgICB8LS1wYWdlIHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tYmxvY2sgZXJhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tcHJvZ3JhbSBleGVjdXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgaW50IHNwaWZjX3JlYWRfcGFnZV90b19jYWNoZSh1aW50MzJfdCBwYWdlX2FkZHIpCit7ICAgICAKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1aW50OF90IHN0YXR1cyA9IDA7CisgICAgCisgICAgc3RydWN0IHNwaWZsYXNoX2NtZF90IGNtZCA9IHsgICBDTURfUkVBRF9QQUdFX1RPX0NBQ0hFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkNfQUREUl9CWVRFX05VTV8yNCwgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCQorICAgIHNwaWZjX2NsZWFyX2ZpZm8oKTsKKyAgICBzcGlmY19jbGVhcl9pbnQoKTsKKyAgICBzcGlmY19zZXR1cF9jbWQoJmNtZCwgcGFnZV9hZGRyLCAwKTsgICAKKyAgICBzcGlmY19zdGFydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICByZXQgPSBzcGlmY193YWl0X2NtZF9lbmQoKTsgICAgICAgICAgICAKKyAgICBpZihyZXQgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCQorICAgIGRvCisgICAgeworICAgICAgICBzcGlmY19nZXRfZmVhdHVyZShSRUdfU1RBVFVTLCAmc3RhdHVzKTsKKyAgICB9d2hpbGUoIHN0YXR1cyAmIE9JUCk7CisgICAgIAorICAgIHJldHVybiAwOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgIHNwaWZjX3JlYWRfZnJvbV9jYWNoZQorICogRGVzY3JpcHRpb246IAorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCSBPdXRwdXQ6CisgKiBSZXR1cm5zOgorICogT3RoZXJzOiAgW0luc3RydWN0aW9uXSAgICAgICAgICAgICAgICAgfC0tYWRkciB3aWR0aCBpcyAxNiBiaXQKKyAgICAgICAgICAgIFthZGRyXSAgICAgICAgICAgICAgICAgICAgICAgIHwtLWR1bW15IGN5Y2VsIDgvNC8yCisgICAgICAgICAgICBbZHVtbXldICAgICAgICAgICAgICAgICAgICAgICB8LS1yZWFkIGZvcm0gY2FjaGUoWDEsWDIsWDQpCisgICAgICAgICAgICBbZGF0YV9yeF0gICAgICAgICAgICAgICAgICAgICB8LS1yZWFkIGZvcm0gY2FjaGUoZHVhbCxxdWFkKUlPCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgaW50IHNwaWZjX3JlYWRfZnJvbV9jYWNoZSh1aW50MzJfdCBjb2x1bW5fYWRkciwgdWludDMyX3QgbGVuLCB1aW50OF90ICpidWYpCit7ICAgICAgCisgICAgaW50IHJldCA9IDA7CisKKyAgICB1aW50MzJfdCBsZW5fdG1wID0gMDsKKyAgICBzdHJ1Y3Qgc3BpZmxhc2hfY21kX3QgY21kOworICAgIAorICAgIGNtZC5jbWQgPSBDTURfUkVBRF9GUk9NX0NBQ0hFOyAgICAgICAgICAKKyAgICBjbWQuZHVteV9ieXRlcyA9IDE7ICAgICAgICAgICAgICAgICAgICAgCisgICAgY21kLmR1bXlfYml0cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgIAorICAgIGNtZC5hZGRyX3R4X2VuID0gMTsgICAgICAgICAgICAgICAgICAgICAKKyAgICBjbWQuYWRkcl93aWR0aCA9IEZDX0FERFJfQllURV9OVU1fMTY7ICAgCisgICAgY21kLmRhdGFfdHhfZW4gPSAwOyAgICAgICAgICAgICAgICAgICAgIAorICAgIGNtZC5kYXRhX3J4X2VuID0gMTsgICAgICAgICAgICAgICAgICAgICAKKyAgICBjbWQuZHVteV90eF9lbiA9IDE7ICAgICAgICAgICAgICAgICAgICAgCisgCisgICAgc3BpZmNfY2xlYXJfZmlmbygpOworICAgIHNwaWZjX2NsZWFyX2ludCgpOworICAgIHNwaWZjX3NldHVwX2NtZCgmY21kLCBjb2x1bW5fYWRkciwgbGVuKTsKKyAgICBzcGlmY19zdGFydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgbGVuX3RtcCA9IHNwaWZjX3JlYWRfZmlmbyhsZW4sIGJ1Zik7ICAgICAgICAgICAKKyAgICBpZiggbGVuX3RtcCAhPSBsZW4gKSAKKyAgICB7CisgICAgICAgIHJldCA9IC0yOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHNwaWZjX3dhaXRfY21kX2VuZCgpOworICAgIGlmKCByZXQgIT0gMCApCisgICAgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiAgICAgbmFuZF9yZWFkX29vYgorICogRGVzY3JpcHRpb246IAorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCSBPdXRwdXQ6CisgKiBSZXR1cm5zOgorICogT3RoZXJzOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBzcGlmY19yZWFkX29vYih1aW50OF90ICpidWYsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgbGVuKQoreyAgCisJdWludDMyX3QgY29sdW1uX29mZnNldCA9IHNwaV9mbGFzaF9pbmZvLT5wYWdlX3NpemU7CisJdWludDMyX3QgcGFnZSA9IG9mZnNldCA+PiAoc3BpX2ZsYXNoX2luZm8tPnBhZ2Vfc2l6ZV9zaGlmdCk7CisJdWludDMyX3QgYmxvY2tzID0gb2Zmc2V0ID4+IChzcGlfZmxhc2hfaW5mby0+YmxvY2tfc2l6ZV9zaGlmdCk7CisJCisJc3BpZmNfcmVhZF9wYWdlX3RvX2NhY2hlKHBhZ2UpOworCisJaWYoKHNwaV9mbGFzaF9pbmZvLT5wbGFuZXMgPT0gMikgJiYgKChibG9ja3MlMikgIT0gMCkpCisJeworCQljb2x1bW5fb2Zmc2V0IHw9ICgweDEgPDwgMTIpOworCX0KKwlzcGlmY19yZWFkX2Zyb21fY2FjaGUoY29sdW1uX29mZnNldCwgc3BpX2ZsYXNoX2luZm8tPm9vYl9zaXplLCBidWYpOworfQorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogICAgIHJlYWRfcGFnZQorICogRGVzY3JpcHRpb246IAorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCSBPdXRwdXQ6CisgKiBSZXR1cm5zOgorICogT3RoZXJzOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworaW50MzJfdCBzcGlmY19yZWFkX3BhZ2UodWludDMyX3QgYnVmLCB1aW50MzJfdCBvZmZzZXQpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCBmZWF0dXJlID0gMHgwOworCisJdWludDMyX3QgcGFnZSA9IG9mZnNldCA+PiAoc3BpX2ZsYXNoX2luZm8tPnBhZ2Vfc2l6ZV9zaGlmdCk7CisJdWludDMyX3QgYmxvY2tzID0gb2Zmc2V0ID4+IChzcGlfZmxhc2hfaW5mby0+YmxvY2tfc2l6ZV9zaGlmdCk7CisJdWludDMyX3QgY29sdW1uX29mZnNldCA9IDA7CisKKwlpZiggKGJ1ZiAmIDB4MykgIT0gMCApCQkvKiBETUG12Na30qrH8zTX1r3attTG6yAqLworCXsKKwkJcHJpbnRmKCJhZGRyIGVyci5cbiIpOyAKKwkJcmV0dXJuIC0xOyAgICAgIAorCX0KKworCXJldCA9IHNwaWZjX3JlYWRfcGFnZV90b19jYWNoZShwYWdlKTsKKwlpZiggcmV0ICE9IDAgKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3BpZmNfZ2V0X2ZlYXR1cmUoUkVHX1NUQVRVUywgJmZlYXR1cmUpOworCWlmKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJaWYoKGZlYXR1cmU+PkVDQ19FUlJfQklUICYgMHgzKSA9PSAweDIpCisJeworCQlwcmludGYoImVjYyBlcnIuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZigoc3BpX2ZsYXNoX2luZm8tPnBsYW5lcyA9PSAyKSAmJiAoKGJsb2NrcyUyKSAhPSAwKSkKKwl7CisJCWNvbHVtbl9vZmZzZXQgfD0gKDB4MSA8PCAxMik7CisJfQorCXJldCA9IHNwaWZjX3JlYWRfZnJvbV9jYWNoZShjb2x1bW5fb2Zmc2V0LCBzcGlfZmxhc2hfaW5mby0+cGFnZV9zaXplLCAodWludDhfdCAqKWJ1Zik7CisJaWYocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiAgICAgcmVhZF9wYWdlCisgKiBEZXNjcmlwdGlvbjogCisgKiBQYXJhbWV0ZXJzOgorICoJIElucHV0OgorICoJIE91dHB1dDoKKyAqIFJldHVybnM6CisgKiBPdGhlcnM6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitpbnQzMl90IHNwaWZjX3JlYWRfcGFnZV9yYXcodWludDMyX3QgYnVmLCB1aW50MzJfdCBvZmZzZXQpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgdWludDhfdCBmZWF0dXJlID0gMHgwOworCisgICAgdWludDMyX3QgcGFnZSA9IG9mZnNldCA+PiAoc3BpX2ZsYXNoX2luZm8tPnBhZ2Vfc2l6ZV9zaGlmdCk7CisKKyAgICBpZiggKGJ1ZiAmIDB4MykgIT0gMCApCQkvKiBETUG12Na30qrH8zTX1r3attTG6yAqLworICAgIHsKKyAgICAgICAgcHJpbnRmKCJhZGRyIGVyci5cbiIpOyAKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgIAorICAgIH0KKyAgICAKKyAgICByZXQgPSBzcGlmY19yZWFkX3BhZ2VfdG9fY2FjaGUocGFnZSk7CisgICAgaWYoIHJldCAhPSAwICkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IHNwaWZjX3JlYWRfZnJvbV9jYWNoZSgwLCBzcGlfZmxhc2hfaW5mby0+cGFnZV9zaXplLCAodWludDhfdCAqKWJ1Zik7CisJaWYocmV0ICE9IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgICBuYW5kX3JlYWQKKyAqIERlc2NyaXB0aW9uOiAKKyAqIFBhcmFtZXRlcnM6CisgKgkgSW5wdXQ6CisgKgkgT3V0cHV0OgorICogUmV0dXJuczoKKyAqIE90aGVyczogZnJvbTogbXVzdCBwYWdlIGFsaWduIGxlbjogIG11c3QgcGFnZSBhbGlnbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworaW50MzJfdCBzcGlmY19yZWFkKHVpbnQzMl90IGZyb20sIHVpbnQzMl90IGxlbiwgdWludDMyX3QgdG8pCit7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gZnJvbTsKKyAgICB1aW50MzJfdCBsZWZ0X3RvX3JlYWQgPSBsZW47CisgICAgdWludDMyX3QgcF90byA9IHRvOworICAgIGludDMyX3QgcmV0ID0gMDsKKyAgICBpbnQzMl90IHBhZ2Vfc2l6ZSA9IChzcGlfZmxhc2hfaW5mby0+cGFnZV9zaXplKTsKKworICAgIGlmKChvZmZzZXQgJiAocGFnZV9zaXplIC0gMSkpIHx8IChsZW4gJiAocGFnZV9zaXplIC0gMSkpICkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsgICAgICAgCisgICAgfQorCisgICAgd2hpbGUoIGxlZnRfdG9fcmVhZCA+IDAgKQorICAgIHsgICAgICAgCisgICAgICAgIHJldCA9IHNwaWZjX3JlYWRfcGFnZShwX3RvLCBvZmZzZXQpOworCQlpZihyZXQgIT0gMCkKKwkJeworCQkJcmV0dXJuIC0xOworCQl9CisgICAgICAgIAorICAgICAgICBsZWZ0X3RvX3JlYWQgLT0gcGFnZV9zaXplOworICAgICAgICBvZmZzZXQgKz0gcGFnZV9zaXplOworICAgICAgICBwX3RvICs9IHBhZ2Vfc2l6ZTsgICAgICAgICAgCisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogICAgIG5hbmRfcmVhZF9pZAorICogRGVzY3JpcHRpb246IAorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCisgKgkgT3V0cHV0OgorICoKKyAqIFJldHVybnM6CisgKgorICoKKyAqIE90aGVyczoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyBpbnQzMl90IHJlYWRfaWQgKHZvaWQpCit7CisgICAgdWludDhfdCBpZFs0XTsKKyAgICBjb25zdCBzdHJ1Y3Qgc3BpX2ZsYXNoX2RldmljZV9wYXJhICpzcGlfZmxhc2ggPSAmc3BpX2ZsYXNoX3BhcmFbMF07CisKKyAgICBzcGlmY19yZWFkX2lkKDB4MCwgaWQsIDIpOworCQorICAgIHdoaWxlKCBzcGlfZmxhc2gtPm1hbnVmX2lkICE9IDAgKQorICAgIHsgICAKKyAgICAgICAgaWYoICgodWludDhfdClpZFswXSA9PSBzcGlfZmxhc2gtPm1hbnVmX2lkKSAmJiAKKyAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpaWRbMV0gPT0gc3BpX2ZsYXNoLT5kZXZpY2VfaWQpICkKKyAgICAgICAgeworICAgICAgICAgICAgc3BpX2ZsYXNoX2luZm8gPSBzcGlfZmxhc2g7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfTsKKyAgICAgICAgc3BpX2ZsYXNoKys7CisgICAgfQorICAgIAorICAgIHJldHVybiAtMTsgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiAgICAgCisgKiBEZXNjcmlwdGlvbjogCisgKiBQYXJhbWV0ZXJzOgorICoJIElucHV0OgorICoKKyAqCSBPdXRwdXQ6CisgKgorICogUmV0dXJuczoKKyAqCisgKgorICogT3RoZXJzOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCByZWFkX2RhdGEodWludDMyX3QgZnJvbSwgdWludDMyX3QgbGVuLCB1aW50MzJfdCB0bykKK3sKKyAgICB1aW50MzJfdCBvZmZzZXQgPSBmcm9tOworICAgIHVpbnQzMl90IGxlZnRfdG9fcmVhZCA9IGxlbjsKKyAgICB1aW50MzJfdCBwX3RvID0gdG87CisgICAgaW50MzJfdCByZXQgPSAwOworICAgIGludDMyX3QgYmxvY2tfc2l6ZSA9IChzcGlfZmxhc2hfaW5mby0+YmxvY2tfc2l6ZSk7CisgICAgICAgICAgICAKKyAgICB3aGlsZShsZWZ0X3RvX3JlYWQgPiAwKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgYmxvY2tfb2Zmc2V0ID0gb2Zmc2V0ICYgKGJsb2NrX3NpemUgLSAxKTsKKwkJdWludDMyX3QgcmVhZF9sZW5ndGg7CisKKyAgICAgICAgaWYoIG5hbmRfYmxvY2tfaXNiYWQob2Zmc2V0KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9mZnNldCArPSBibG9ja19zaXplOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBpZiAobGVmdF90b19yZWFkIDwgKGJsb2NrX3NpemUgLSBibG9ja19vZmZzZXQpKQorCQkJcmVhZF9sZW5ndGggPSBsZWZ0X3RvX3JlYWQ7CisJCWVsc2UKKwkJCXJlYWRfbGVuZ3RoID0gYmxvY2tfc2l6ZSAtIGJsb2NrX29mZnNldDsKKyAgICAgIAorICAgICAgICByZXQgPSBzcGlmY19yZWFkKG9mZnNldCwgcmVhZF9sZW5ndGgsIHBfdG8pOworCQlpZihyZXQgIT0gMCkKKwkJeworCQkJcmV0dXJuIC0xOworCQl9CisKKyAgICAgICAgbGVmdF90b19yZWFkIC09IHJlYWRfbGVuZ3RoOworICAgICAgICBvZmZzZXQgKz0gcmVhZF9sZW5ndGg7CisgICAgICAgIHBfdG8gKz0gcmVhZF9sZW5ndGg7ICAgICAgICAgCisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgICBuYW5kX2luaXQKKyAqIERlc2NyaXB0aW9uOiAKKyAqIFBhcmFtZXRlcnM6CisgKgkgSW5wdXQ6CisgKgorICoJIE91dHB1dDoKKyAqCisgKiBSZXR1cm5zOgorICoKKyAqCisgKiBPdGhlcnM6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHNwaWZjX2luaXQgKHZvaWQpCit7CisgICAgaW50MzJfdCByZXQgPSAwOworICAgIHNwaWZjX2VuYWJsZSgpOworICAgIHJldCA9IHJlYWRfaWQoKTsKKyAgICBpZihyZXQgIT0gMCkKKyAgICB7CisJCXByaW50ZigiaWQgZXJyIVxuIik7CisJCXJldHVybiAtMTsKKyAgICB9CisgICAgICAgIAorCWZsYXNoLmZsYXNoX3R5cGUgPSBTUElfTkFORF9CT09UOworCWZsYXNoLm1hbnVmX2lkID0gc3BpX2ZsYXNoX2luZm8tPm1hbnVmX2lkOworCWZsYXNoLmRldmljZV9pZCA9IHNwaV9mbGFzaF9pbmZvLT5kZXZpY2VfaWQ7CisJZmxhc2gucGFnZV9zaXplID0gc3BpX2ZsYXNoX2luZm8tPnBhZ2Vfc2l6ZTsKKwlmbGFzaC5wYWdlX3NpemVfc2hpZnQgPSBzcGlfZmxhc2hfaW5mby0+cGFnZV9zaXplX3NoaWZ0OworCWZsYXNoLm9vYl9zaXplID0gc3BpX2ZsYXNoX2luZm8tPm9vYl9zaXplOworCWZsYXNoLmJsb2NrX3NpemUgPSBzcGlfZmxhc2hfaW5mby0+YmxvY2tfc2l6ZTsKKwlmbGFzaC5ibG9ja19zaXplX3NoaWZ0ID0gc3BpX2ZsYXNoX2luZm8tPmJsb2NrX3NpemVfc2hpZnQ7CisJZmxhc2guYmxvY2tfbnVtID0gc3BpX2ZsYXNoX2luZm8tPmJsb2NrX251bTsKKwlmbGFzaC5yZWFkX3BhZ2VfcmF3ID0gc3BpZmNfcmVhZF9wYWdlX3JhdzsKKwlmbGFzaC5yZWFkX29vYiA9IHNwaWZjX3JlYWRfb29iOworCWZsYXNoLnJlYWQgPSByZWFkX2RhdGE7CisJCisgICAgcmV0dXJuIDA7CisJCit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogICAgIAorICogRGVzY3JpcHRpb246IAorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCSBPdXRwdXQ6CisgKiBSZXR1cm5zOgorICogT3RoZXJzOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworaW50IGJvYXJkX2ZsYXNoX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwljaGFyIGJvb3RfbW9kZSA9IDA7CisKKwlwcmludGYoInNwaS1uYW5kOiIpOworCQorCWJvb3RfbW9kZSA9IGdldF9ib290X21vZGUoKTsKKwlpZihib290X21vZGUgIT0gU1BJX05BTkRfQk9PVCkKKwl7CisJCXByaW50ZigibW9kZSBlcnIuXG4iKTsKKwkJcmV0dXJuIC0xOyAKKwl9CisKKwl3cml0ZWwoQ0ZHX1NUQVJUX01PREVfU1BJX05BTkQsIENGR19CT09UX01PREVfU1RBUlRfTU9ERV9GT1JfVUJPT1QpOyAKKwlyZXQgPSBzcGlmY19pbml0KCk7CisJaWYocmV0ICE9IDApCisJeworCQlwcmludGYoImluaXQgZXJyLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJpbml0IG9rLlxuIik7CisKKy8vCW5hbmRfY3JlYXRfYmJ0KCk7CituYW5kX2NyZWF0X3JhbV9iYnQoKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCg==